2012-10-29 115 views
0

上市在我的FTP服務器,我有以下文件夾結構FTP目錄/子目錄使用edtFTPnet,C#

- Parent Directory 
    -a.txt 
    -b.txt.old 
    -SubDirectory1 
    -c.txt 
    -NestedSubDirectory1 
     -d.txt 
    -SubDirectory2 
    -e.txt 
    -f.txt.old 

SDS的數目是不固定的。我需要一種方法來獲取所有文件(可以是任何格式),而不需要父目錄中的.old擴展名。 我目前正在使用第三方dll edtFTPnet。

ftpConnection.GetFileInfos()Where(f => !(f.Name.EndsWith(".old"))).ToList(); 

這可以幫助我獲得當前工作目錄級別的文件和文件夾的詳細信息。

有人可以告訴我一種方法來獲取所有與父目錄,子目錄和嵌套子目錄的文件。

該解決方案可能會或可能不會使用edtFTPnet。

回答

2

FTPConnection.GetFileInfos()返回FTPFile的數組。類FTPFile具有布爾型屬性Dir,它指示其文件名是否訪問文件(false)或目錄(true)。

像這樣的東西應該工作:

void ReadSubDirectories(FTPConncetion connection, FTPFile[] files) 
{ 
    foreach (var file in files) 
    { 
     if (file.Dir) 
     { 
      // Save parent directory 
      var curDir = connection.ServerDirectory; 

      // Move into directory 
      connection.ChangeWorkingDirectory(file.Name) 

      // Read all files 
      ReadSubDirectories(connection, connection.GetFileInfos()); 

      // Move back into parent directory 
      connection.ChangeWorkingDirectory(curDir) 
     } 
     else 
     { 
      // Do magic with your files 
     } 
    } 
} 

但是你可能使用會更好只是.NET的內置,因爲它的方法FtpWebRequest類和命名約定明確,它更好地記錄和更容易找到引用線上。

+0

嘿嘿,謝謝lot..I並開始檢查出的FtpWebRequest,但出人意料的沒有發現它太多的參考/文檔。你能否提供幾個鏈接?此外,我發現處理ftpfiles或其他數據類型比處理由FTPResponse返回的流數據更容易.... –

0

嘗試使用擴展這樣的:

class Program 
    { 
     static void Main(string[] args) 
     { 
      using (var connection = new FTPConnection 
      { 
       ServerAddress = "127.0.0.1", 
       UserName = "Admin", 
       Password = "1", 
      }) 
      { 


       connection.Connect(); 
       connection.ServerDirectory = "/recursive_folder"; 
       var resultRecursive = 
        connection.GetFileInfosRecursive().Where(f => !(f.Name.EndsWith(".old"))).ToList(); 
       var resultDefault = connection.GetFileInfos().Where(f => !(f.Name.EndsWith(".old"))).ToList(); 


      } 

     } 
    } 

    public static class FtpClientExtensions 
    { 
     public static FTPFile[] GetFileInfosRecursive(this FTPConnection connection) 
     { 
      var resultList = new List<FTPFile>(); 
      var fileInfos = connection.GetFileInfos(); 
      resultList.AddRange(fileInfos); 
      foreach (var fileInfo in fileInfos) 
      { 
       if (fileInfo.Dir) 
       { 
        connection.ServerDirectory = fileInfo.Path; 
        resultList.AddRange(connection.GetFileInfosRecursive()); 
       } 
      } 
      return resultList.ToArray(); 
     } 
    }