2013-06-22 9 views
0

所以,我有一个“扫描”一个FTP服务器的方法。首先它扫描根,并确定哪些内容是文件,哪个是文件夹,并将它们添加到两个不同的集合(文件夹和字符串的字符串列表,文件的int类型字典)中。毕竟它自称。该方法运行在检查列表计数的if ... else语句中。如果它为零,该方法将扫描根文件夹。否则它应该将列表的第一个元素连接到ftp地址并检查该文件夹。这是问题。每次我尝试执行该方法时,在第二次运行(在扫描完根后)它会抛出一个InvalidOperation异常,因为“该集合已被修改;枚举操作可能无法执行”。我怎样才能避免这种情况?如何避免以下方法中的InvalidOperationException?

这里顺便代码:

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) 
      { 
       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 (Exception e) 
       { 
        MessageBox.Show(e.Message); 
       } 
      } 
     } 
     level = 1; 
     ListFilesOnServer(); 
    } 
+0

'目录'是一个类的成员,我推定和修改'DirOrFile'的执行内? – rene

回答

2

在C#中,枚举无法继续之后底层集合已结构修饰。周围有此两种常用方法:

(1)创建的集合(与ToArray的(),例如)副本,并列举了该副本:

foreach (string file in directories.ToArray()) { 
    ... 
} 

(2)使用传统的for循环。这只会是正确的,如果你只追加到列表的末尾:

for (var i = 0; i < directories.Count; ++i) { 
    ... code which might append to directories 
} 
+0

非常感谢:)虽然我想过这个解决方案,但我没有尝试过......也许我不确定自己:)。我也投了你的解决方案。 – NeverJr

相关问题