だから、私はftpサーバーを「スキャン」する方法を持っています。最初にルートをスキャンし、どのコンテンツがファイルで、どのコンテンツがフォルダーであるかを判別し、それらを 2 つの異なるコレクション (フォルダーの文字列リストとファイルの文字列、int 型辞書) に追加します。そして結局のところ、それは自分自身を呼び出します。このメソッドは、リストのカウントをチェックする if...else ステートメントで実行されます。ゼロの場合、メソッドはルート フォルダーをスキャンします。それ以外の場合は、リストの最初の要素を ftp アドレスに連結し、そのフォルダーをチェックする必要があります。そして、ここに問題があります。メソッドを実行しようとするたびに、2 回目の実行時 (ルートのスキャンが終了した後) に、「コレクションが変更されたため、列挙操作が実行されない可能性がある」ため、InvalidOperation Exception がスローされます。どうすればこれを回避できますか?
ちなみにコードは次のとおりです。
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();
}