2013-06-22 2 views
0

그래서 FTP 서버를 "검사하는"방법이 있습니다. 처음에는 루트를 검색하고 어떤 내용이 파일이고 어떤 내용이 폴더인지 확인한 다음 두 개의 다른 모음 (폴더 및 문자열의 문자열 목록, 파일의 int 유형 사전)을 추가합니다. 그리고 결국 그것 자체를 호출합니다. 이 메서드는 목록의 수를 확인하는 if ... else 문에서 실행됩니다. 값이 0이면 메서드는 루트 폴더를 검사합니다. 그렇지 않으면 목록의 첫 번째 요소를 ftp 주소에 연결하고 해당 폴더를 확인해야합니다. 여기에 문제가 있습니다. 메서드를 실행하려고 할 때마다 두 번째 실행 (루트 검사가 끝난 후)에 "컬렉션이 수정되었으므로 열거 연산이 실행되지 않을 수 있습니다"때문에 InvalidOperation Exception이 발생합니다. 어떻게 이것을 피할 수 있습니까?다음 메소드에서 InvalidOperationException을 피할 수있는 방법은 무엇입니까?

여기 그런데 코드입니다 : 기본 컬렉션 구조적으로 수정 된 후 C#에서

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

'directories' 내가 추정과'DirOrFile'의 구현 내부에 수정 된 클래스 멤버 : 당신은 단지리스트의 말미에 추가하는 경우에만 올바른 것인가? – rene

답변

2

는, 열거를 계속할 수 없습니다.

(1) (ToArray()와 예) 컬렉션의 사본을 작성하고 사본을 통해 열거 :

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

(2) 전통에 대한 루프를 사용하여이 주위에 두 가지 일반적인 방법이 있습니다 .

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

많은 감사합니다 :) 나는 그 해결책에 대해 생각했지만, 나는 그것을 시도하지 않았습니다 ... 어쩌면 나는 자신에 대해 확신하지 못했습니다. :) 그리고 당신의 해결책도 뽑았습니다. – NeverJr

관련 문제