2017-11-16 12 views
1

現在、.NET 4.6コンソールアプリケーションで作業しています。私は私のFTPサーバー上の異なるディレクトリからいくつかのXMLファイルを解析する必要があります。すべてのファイルパスを読み込んでIEnumerableに保存して、それをさらに処理する(XMLファイルをオブジェクトにシリアル化する)のが最も良いアプローチだと私は思っていました。FTPディレクトリからIEnumerableへのフォルダパスを読み取る

ルートFTPパスは次のようになります。パスは次のようになり

string urlFtpServer = @"ftp://128.0.1.70"; 

ファイル:

string file1 = @"ftp://128.0.1.70/MyFolder1/Mainfile.xml"; 
string file2 = @"ftp://128.0.1.70/MyFolder1/Subfile.xml"; 
string file3 = @"ftp://128.0.1.70/MyFolder2/Mainfile.xml"; 
string file4 = @"ftp://128.0.1.70/MyFolder2/Subfile.xml"; 
string file5 = @"ftp://128.0.1.70/MyFolder3/Mainfile.xml"; 

私の質問は、あなたが、私はそれらの特定のファイルパスを取得する方法を知っています、ありますか?

私は現在、このコーディングで私のFTPディレクトリのフォルダを読むことができます:

static void Main(string[] args) 
{ 
    string url = @"ftp://128.0.1.70"; 

    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url); 
    request.Method = WebRequestMethods.Ftp.ListDirectoryDetails; 

    request.Credentials = new NetworkCredential("My-User", "mypassword"); 

    FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 

    Stream responseStream = response.GetResponseStream(); 
    StreamReader reader = new StreamReader(responseStream); 
    Console.WriteLine(reader.ReadToEnd()); 

    Console.WriteLine("Directory List Complete, status {0}", response.StatusDescription); 

    reader.Close(); 
    response.Close(); 

    Console.ReadKey(); 
} 

あなたは私がFTPメインディレクトリからすべてのファイルパスを読んで、おそらくList<string>にそれらを格納することができます知っていますか?

ありがとうございます!

+1

なし、彼らはMyFolder1、2と3にあるメインディレクトリません..あなたはMainfileに一致するファイルを探して、すべての経路を通ってitterateことができます。 xmlとsubfile.xml .. – BugFinder

答えて

2

FtpWebRequestには、リスティングファイル操作(リスティングを含む)の明示的なサポートはありません。

  • リスト、サブディレクトリ(など、それらを再度リスト)に再帰

トリッキーな部分は、サブディレクトリからファイルを識別するためのエントリであるリモートディレクトリ

  • 反復:あなたは再帰を自分で実装する必要があります。 FtpWebRequestで携帯可能な方法はありません。 FtpWebRequestは残念ながらMLSDコマンドをサポートしていません。これは、FTPプロトコルのファイル属性を持つディレクトリリストを取得する唯一の移植可能な方法です。 Checking if object on FTP server is file or directoryも参照してください。

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

    • は、ファイルのために失敗することが確実であるとディレクトリ(またはその逆)のために成功したファイル名の操作を行います。私。あなたは "名前"をダウンロードしようとすることができます。成功した場合はファイル、失敗した場合はディレクトリです。
    • あなたがリスト長いディレクトリを使用してあなたが幸運であり、特定の場合には、あなたが
    • (サブディレクトリがいない間、すなわち、すべてのファイルは、拡張子を持つ)ファイル名でディレクトリからファイルを伝えることができます(LIST command = ListDirectoryDetailsメソッド)、サーバー固有のリストを解析しようとします。多くのFTPサーバーは* nix形式のリストを使用します。ここでは、エントリの冒頭にdでディレクトリを指定します。しかし、多くのサーバーは異なる形式を使用します。次の例は、このアプローチ(* nixの形式を仮定して)
    void ListFtpDirectory(
        string url, string rootPath, NetworkCredential credentials, List<string> list) 
    { 
        FtpWebRequest listRequest = (FtpWebRequest)WebRequest.Create(url + rootPath); 
        listRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails; 
        listRequest.Credentials = credentials; 
    
        List<string> lines = new List<string>(); 
    
        using (FtpWebResponse listResponse = (FtpWebResponse)listRequest.GetResponse()) 
        using (Stream listStream = listResponse.GetResponseStream()) 
        using (StreamReader listReader = new StreamReader(listStream)) 
        { 
         while (!listReader.EndOfStream) 
         { 
          lines.Add(listReader.ReadLine()); 
         } 
        } 
    
        foreach (string line in lines) 
        { 
         string[] tokens = 
          line.Split(new[] { ' ' }, 9, StringSplitOptions.RemoveEmptyEntries); 
         string name = tokens[8]; 
         string permissions = tokens[0]; 
    
         string filePath = rootPath + name; 
    
         if (permissions[0] == 'd') 
         { 
          ListFtpDirectory(url, filePath + "/", credentials, list); 
         } 
         else 
         { 
          list.Add(filePath); 
         } 
        } 
    } 
    

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

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

    あなたはサーバ - を解析してトラブルを回避したい場合MLSDコマンドをサポートしている第三者のライブラリを使用したり、様々なLISTのリスト形式を解析したりすることができます。再帰的なダウンロード。

    あなたはSession.EnumerateRemoteFilesに1回の呼び出しで全体のディレクトリを一覧表示することができますWinSCP .NET assemblyと例えば:

    内部
    // Setup session options 
    SessionOptions sessionOptions = new SessionOptions 
    { 
        Protocol = Protocol.Ftp, 
        HostName = "ftp.example.com", 
        UserName = "user", 
        Password = "mypassword", 
    }; 
    
    using (Session session = new Session()) 
    { 
        // Connect 
        session.Open(sessionOptions); 
    
        // List files 
        IEnumerable<string> list = 
         session.EnumerateRemoteFiles("/", null, EnumerationOptions.AllDirectories). 
         Select(fileInfo => fileInfo.FullName); 
    } 
    

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

    (私はWinSCPのの著者だ)それらのパスの

  • +1

    その名誉ある応答、大きな助けてくれてありがとう! :) – TimHorton

    関連する問題