0

だから、私は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();
    }
4

1 に答える 1