2013-06-23 33 views
0

我由可掃描ftp服務器的方法。它在if ... else語句中有兩個部分。在運行,如果第一部分時,目錄列表等於0,和文件夾從文件分開(並把它們放到該列表)。然後(因爲列表不再是空的)else語句應該運行。它有一個foreach循環,它檢查列表中的所有元素,並將它們連接到ftp地址並掃描該文件夾。這是問題。看起來它變成了一個無限循環。我只想檢查服務器上的文件夾並打破循環,但看起來好像找不到有用的解決方案。我該如何解決以下方法?

下面的代碼:

internal void ListFilesOnServer() 
     { 
      ArrayList files = new ArrayList(); 
      if (directories.Count == 0) 
      { 
       try 
       { 
        FtpWebRequest ftpwrq = (FtpWebRequest)WebRequest.Create(server); 
        ftpwrq.Credentials = new NetworkCredential(user, passw); 
        ftpwrq.Method = WebRequestMethods.Ftp.ListDirectory; 
        ftpwrq.KeepAlive = false; 
        FtpWebResponse fresponse = (FtpWebResponse)ftpwrq.GetResponse(); 
        StreamReader sr = new StreamReader(fresponse.GetResponseStream()); 
        string temp = ""; 
        while ((temp = sr.ReadLine()) != null) 
        { 
         files.Add(temp); 
        } 
        temp = String.Empty; 
        sr.Close(); 
        fresponse.Close(); 
        DirOrFile(files); 
       } 
       catch (Exception e) 
       { 
        MessageBox.Show(e.Message); 
       } 
      } 
      else 
      { 
       foreach (string file in directories.ToArray()) 
       { 
        try 
        { 
         FtpWebRequest ftpwrq = (FtpWebRequest)WebRequest.Create(server+"/"+file); 
         ftpwrq.Credentials = new NetworkCredential(user, passw); 
         ftpwrq.Method = WebRequestMethods.Ftp.ListDirectory; 
         ftpwrq.KeepAlive = false; 
         FtpWebResponse fresponse = (FtpWebResponse)ftpwrq.GetResponse(); 
         StreamReader sr = new StreamReader(fresponse.GetResponseStream()); 
         string temp = ""; 
         while ((temp = sr.ReadLine()) != null) 
         { 
          files.Add(temp); 
         } 
         temp = String.Empty; 
         sr.Close(); 
         fresponse.Close(); 
         DirOrFile(files); 
        } 
        catch(ArgumentException) 
        { 

        } 
        catch (Exception e) 
        { 
         MessageBox.Show(e.Message); 
        } 
       } 
      } 
      ListFilesOnServer(); 
     } 
+0

它在哪裏卡住?你是否使用斷點檢查它? – Shaharyar

+0

else語句不會在if後運行,只要有代碼follow.an if語句如果您希望發生這種情況(否則) – Sayse

+0

由於您在不設置目錄的情況下遞歸調用函數,因此您會陷入循環 – Sayse

回答

0

的無限循環,因爲你沒有辦法打出來的遞歸。

遞歸的模式如下

MyRecursiveMethod() 
{ 
    if (conditions) 
    { 
    } 
    else 
    { 
     MyRecursiveMethod() 
    } 
} 

以下是我可能會去改寫這個代碼,使其爲你工作。

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Net; 
using System.Security; 
using System.Windows.Forms; 

namespace ConsoleApplication5 
{ 
    public class FtpTest 
    { 
     string server = "servier/"; 
     string user = "user"; 
     SecureString passw = new SecureString(); 

     public List<string> GetFilesOnServer() 
     { 
      return GetFilesOnServer(server); 
     } 

     public List<string> GetFilesOnServer(string dir) 
     { 
      var root = GetDirectoryContents(dir); 
      var files = new List<string>(); 

      foreach (string name in root) 
      { 
       var path = GetFullPath(dir, name); 
       if (IsDirectory(name)) 
       { 
        var subFiles = GetFilesOnServer(path); 
        files.AddRange(subFiles); 
       } 
       else 
       { 
        files.Add(path); 
       } 
      } 

      return files; 
     } 

     public List<string> GetDirectoryContents(string dir) 
     { 
      var files = new List<string>(); 

      try 
      { 
       var ftpwrq = (FtpWebRequest)WebRequest.Create(dir); 
       ftpwrq.Credentials = new NetworkCredential(user, passw); 
       ftpwrq.Method = WebRequestMethods.Ftp.ListDirectory; 
       ftpwrq.KeepAlive = false; 
       var fresponse = (FtpWebResponse)ftpwrq.GetResponse(); 
       var sr = new StreamReader(fresponse.GetResponseStream()); 
       string fileName = ""; 
       while ((fileName = sr.ReadLine()) != null) 
       { 
        files.Add(fileName); 
       } 
       sr.Close(); 
       fresponse.Close(); 
       return files; 
      } 
      catch (ArgumentException) 
      { 

      } 
      catch (Exception e) 
      { 
       MessageBox.Show(e.Message); 
      } 

      return files; 
     } 

     public static string GetFullPath(string dir, string file) 
     { 
      string path = dir; 
      if (!path.EndsWith("/")) 
       path += "/"; 
      path += file; 
      return path; 
     } 

     public static bool IsDirectory(string name) 
     { 
      return name.IndexOf(".") > 0; 
     } 
    } 
} 

請注意,如果檢索到的項目是目錄,我只能遞歸調用GetFilesOnServer。我還重構了將FTP服務器上的內容抓取爲非遞歸方法的代碼。

希望這可以幫助你。

相關問題