2016-12-12 21 views
1

ネットで検索されましたが、結果が見つかりませんでした。実際に私はrootDirectorySub Directoryにあるすべてのファイルの名前を取得したいと思います。私はコードを試してみたが、それは私のFTPのrootのファイルだけを与える。FTPディレクトリとそのサブディレクトリにあるファイルのリスト名

/ds/product/Jan/ 
/ds/subproduct/Jan/ 
/ds/category/Jan/ 

私が試しコード::それはある

FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create("ftp://" + FtpIP); 
ftpRequest.Credentials = new NetworkCredential(FtpUser, FtpPass); 
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory; 
FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse(); 
StreamReader streamReader = new StreamReader(response.GetResponseStream()); 

List<string> directories = new List<string>(); 

string line = streamReader.ReadLine(); 
while (!string.IsNullOrEmpty(line)) 
{ 
    // directories.Add(line); 
    line = streamReader.ReadLine().ToString(); 
    MessageBox.Show(line); 
} 

streamReader.Close(); 
+0

%の2Fは、CD(ディレクトリ変更)に相当します(私はWinSCPのの著者です)。 msdnを参照してください:https://social.msdn.microsoft.com/Forums/en-US/91e2bed0-9e5e-4503-9e66-d224086e43a8/change-directory-with-ftpwebrequest?forum=ncl – jdweng

答えて

1

は、任意の外部ライブラリなしでこれを実装するのは容易ではないよ、私はFTPを持っている

フォルダはとして怒鳴るようなものです。残念ながら、.NET FrameworkやPowerShellでは、ディレクトリ内のファイルを再帰的にリストすることはできません。

あなたがいることを自分で実装する必要があります。サブディレクトリに再帰的

  • 一覧リモートディレクトリ
  • 反復エントリ、 - それらを再度リストなど

トリッキーな部分は、ファイルを識別することですサブディレクトリから。 .NETフレームワーク(FtpWebRequest)でポータブルな方法でこれを行う方法はありません。残念ながら、.NETフレームワークはMLSDコマンドをサポートしていません。このコマンドは、FTPプロトコルのファイル属性を持つディレクトリリストを取得する唯一の移植可能な方法です。 Checking if object on FTP server is file or directoryも参照してください。

あなたのオプションは以下のとおりです。

  • は、ファイルのために失敗することが確実であるとディレクトリ(またはその逆)のために成功したファイル名の操作を行います。私。あなたは "名前"をダウンロードしようとすることができます。
  • あなたがリスト長いディレクトリを使用してあなたが幸運であり、特定の場合には、あなたが
  • (サブディレクトリがいない間、すなわち、すべてのファイルは、拡張子を持つ)ファイル名でディレクトリからファイルを伝えることができます(LIST command = ListDirectoryDetailsメソッド)、サーバー固有のリストを解析しようとします。多くのFTPサーバーは* nix形式のリストを使用します。ここでは、エントリの冒頭にdでディレクトリを指定します。しかし、多くのサーバーは異なる形式を使用します。次の例は、このアプローチ(* nixの形式を仮定して)
static void ListFtpDirectory(string url, NetworkCredential credentials) 
{ 
    WebRequest listRequest = WebRequest.Create(url); 
    listRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails; 
    listRequest.Credentials = credentials; 

    List<string> lines = new List<string>(); 

    using (WebResponse listResponse = listRequest.GetResponse()) 
    using (Stream listStream = listResponse.GetResponseStream()) 
    using (StreamReader listReader = new StreamReader(listStream)) 
    { 
     while (!listReader.EndOfStream) 
     { 
      string line = listReader.ReadLine(); 
      lines.Add(line); 
     } 
    } 

    foreach (string line in lines) 
    { 
     string[] tokens = 
      line.Split(new[] { ' ' }, 9, StringSplitOptions.RemoveEmptyEntries); 
     string name = tokens[8]; 
     string permissions = tokens[0]; 

     if (permissions[0] == 'd') 
     { 
      Console.WriteLine($"Directory {name}"); 

      string fileUrl = url + name; 
      ListFtpDirectory(fileUrl + "/", credentials); 
     } 
     else 
     { 
      Console.WriteLine($"File {name}"); 
     } 
    } 
} 

利用機能などを使用しています。

NetworkCredential credentials = new NetworkCredential("user", "mypassword"); 
string url = "ftp://ftp.example.com/directory/to/list/"; 
ListFtpDirectory(url, credentials); 

あなたはサーバ - を解析してトラブルを回避したい場合MLSDコマンドをサポートしている第三者のライブラリを使用したり、様々なLISTのリスト形式を解析したりすることができます。コードは、単純に、より堅牢で、プラットフォームに依存しないで

// Setup session options 
var sessionOptions = new SessionOptions 
{ 
    Protocol = Protocol.Ftp, 
    HostName = "ftp.example.com", 
    UserName = "user", 
    Password = "mypassword", 
}; 

using (var session = new Session()) 
{ 
    // Connect 
    session.Open(sessionOptions); 

    // Enumerate files 
    var options = 
     EnumerationOptions.EnumerateDirectories | EnumerationOptions.AllDirectories; 
    IEnumerable<RemoteFileInfo> fileInfos = 
     session.EnumerateRemoteFiles("/directory/to/list", null, options); 
    foreach (var fileInfo in fileInfos) 
    { 
     Console.WriteLine(fileInfo.FullName); 
    } 
} 

だけでなく:

WinSCP .NET assemblyとたとえば、あなたはSession.EnumerateRemoteFilesに1回の呼び出しで再帰的にディレクトリ全体を一覧表示することができます。 RemoteFileInfo classを介して他のすべてのファイル属性(サイズ、変更時刻、許可、所有権)を簡単に利用できるようにします。

内部的には、サーバによってサポートされている場合、WinSCPはMLSDコマンドを使用します。そうでない場合は、LISTコマンドを使用し、数多くの異なるリスト形式をサポートします。

+0

あなたのansewerありがとうございました –

+0

PowerShellコードを掲示している間はあなたの質問はC#に関するものであることに気がつきました:)修正されました。 –

関連する問題