2012-02-08 19 views
2

ファイルをFTPサイトに移動しようとしています。私たちは、このようなフォルダ構造を作成する必要があります。FTP:ネストされたディレクトリを自動的に作成する

/deeply/nested/folder/structure/index.html

昨日は、我々は一度に複数のフォルダを作成することはできません実現しましたので、これは動作しません。

MKD /深く/ネストされた/フォルダ/構造

ので、コードの中で、私たちは、1各フォルダを作成したループを書きました既に存在するフォルダによって引き起こされたエラーを無視することができます。エラーを無視することは総体的です。

これらのネストされたフォルダを複数のアクションではなく1つのアクションで作成する方法はありますか?既にフォルダが存在するかどうかを確認するコマンドはありますか?完全なパスを含めてファイルをプッシュするだけであれば、FTPは私のためのディレクトリを作成するのに十分なほどスマートになりますか?

答えて

2

いいえ、サブフォルダを含むフォルダを作成する標準的な方法はありません。 ディレクトリが存在するかどうかを確認する標準的な方法もありません。 LISTまたはMLSD(サポートされている場合)を使用して、結果を解析する必要があります。あなたは、必要な機能をサポートするサードパーティのコンポーネントを使用することはできませんか?

+0

LISTとNLSTは、即時障害を引き起こすのではなく、タイムアウトを引き起こす可能性があります。実際にディレクトリが存在する場合は、正常に動作します。 –

+0

問題の一部は、クライアントからFTP情報を受け取っていることです。 FTPサーバーが何を使用しているかわかりません。個人的には、私たちは間違った問題に取り組んでおり、FTPの代替案について考える必要があります。しかし、これは、HTMLページをクロスサイトに読み込むためのかなり標準的な(貧弱ではないにしても)アプローチです。 S3のようなものは単にオプションではないかもしれません。 –

+0

@TravisParks間違って書かれたサーバーは何かを引き起こす可能性があります。コマンドだけでは何も起こりません。代わりに、SFTP(SSHファイル転送プロトコル)を見てみましょう。 –

0

ここでは単純なC#の例を書いていますが、誰かがこのコードを必要とするかもしれません。

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Net; 

namespace Deployer 
{ 
    public class RecursiveFolderUploader 
    { 
     private const string SrcFullPath = @"C:\prg\Snowinmars\Snowinmars.Ui"; 
     private readonly IList<string> foldersOnServer; 
     private Client ftpClient; // that's your ftp client, init it 

     public RecursiveFolderUploader() 
     { 
      this.foldersOnServer = new List<string>(); 
     } 

     private void UploadAll(DirectoryInfo directoryInfo) 
     { 
      // ftp://login:[email protected]/path/to/root/mydir/anotherdir/file.dat 
      // ^________________uri_______________________^_relevationPath_^ 
      foreach (var file in directoryInfo.EnumerateFiles()) 
      { 
       if (!file.Directory.FullName.StartsWith(RecursiveFolderUploader.SrcFullPath)) 
       { 
        throw new InvalidOperationException($"File {file.FullName} is not from {RecursiveFolderUploader.SrcFullPath} folder"); 
       } 

       string relevationPath; // all folders from root up to file 

       if (file.Directory.FullName.Length == RecursiveFolderUploader.SrcFullPath.Length) 
       { 
        relevationPath = ""; 
       } 
       else 
       { 
        relevationPath = file.Directory.FullName.Substring(RecursiveFolderUploader.SrcFullPath.Length, file.Directory.FullName.Length - RecursiveFolderUploader.SrcFullPath.Length); 

        if (relevationPath.StartsWith("\\")) 
        { 
         relevationPath = relevationPath.Remove(0, 1); 
        } 
       } 

       string destination; 
       if (string.IsNullOrWhiteSpace(relevationPath)) 
       { 
        destination = file.Name; 
       } 
       else 
       { 
        destination = Path.Combine(relevationPath, file.Name).Replace("\\", "/"); 
       } 

       try 
       { 
        ftpClient.UploadFile(file.FullName, destination); 
       } 
       catch (WebException e) 
       { 
        // that means that there's no such folder or something else goes wrong 
        // we can check it by creating folders and try again 
        var parts = relevationPath.Replace("\\", "/").Split('/'); 

        for (int i = 1; i <= parts.Length; i++) 
        { 
         var path = string.Join("/", parts.Take(i)); 

         if (!foldersOnServer.Contains(path)) 
         { 
          ftpClient.MakeDirectory(path); 
          foldersOnServer.Add(path); 
         } 
        } 

        try 
        { 
         ftpClient.UploadFile(file.FullName, destination); 
        } 
        catch (Exception innerE) 
        { 
         // if it doesn't help - trouble isn't in folders 
         throw new WebException($"Can't find folder {relevationPath}", innerE); 
        } 
       } 
      } 

      foreach (var directory in directoryInfo.EnumerateDirectories()) 
      { 
       UploadAll(directory); 
      } 
     } 
    } 
}