0

フォルダーを検索する再帰関数があります。

    private int contFiles = 0;
    private List<string> GetFiles(string folder, string filter)
    {
        var files = new List<string>();
        Action<string> getFilesInDir = null;
        getFilesInDir = new Action<string>(dir =>
        {
            contFiles++;
            tslQuant.Text = contFiles.ToString(); //ToolStripItem
            try
            {
                // get all the files in this directory
                files.AddRange(Directory.GetFiles(dir, filter));                   
                // and recursively visit the directories
                foreach (var subdir in Directory.GetDirectories(dir))
                {
                    getFilesInDir(subdir);
                }
            }
            catch (UnauthorizedAccessException uae)
            {
                Console.WriteLine(uae.Message);
            }
        });
        getFilesInDir(folder);
        return files;
    }

この関数は contFiles をインクリメントし、その数値を ToolStripItem に設定しますが、常に「System.ArgumentOutOfRangeException」を取得しています。

この値を (最大 5000 まで) 増やして TSI に表示するにはどうすればよいですか?

エラー:

System.ArgumentOutOfRangeException は処理されませんでした Message="Index was out of range. It must be non-negative and less than the size of collection. Parameter name: index"

Source="mscorlib" ParamName="index" StackTrace: System.Collections.ArrayList.get_Item(Int32 インデックス) 内 System.Windows.Forms.ToolStripItemCollection.get_Item(Int32 インデックス) 内 System.Windows.Forms.ToolStrip.OnPaint(PaintEventArgs) e) System.Windows.Forms.Control.WndProc(Message& m) の System.Windows.Forms.Control.WmPaint(Message& m) の System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer) で。 System.Windows.Forms.StatusStrip.WndProc(Message& m) の Windows.Forms.ToolStrip.WndProc(Message& m) System.Windows.Forms.Control.Control.ControlNativeWindow.WndProc(Message& m) の System.Windows.Forms.NativeWindow。 DebuggableCallback(IntPtr hWnd、Int32 msg、IntPtr wparam、IntPtr lparam) InnerException:

編集

プログラムのコード全体を読んだ後、関数が Do_Work 内で呼び出されていることに気付きました。

backgroundWorker2.ReportProgress((1));

報告する aaand すべてが機能しています。

理由はわかりませんが、どういうわけか、toolStripItem は backgroundWorker 内でもアクセスできますが、ラベルやその他のコントロールはアクセスできません。

4

1 に答える 1

0

contFiles変数をゼロにリセットしたことはないようです。また、GetFiles()何度も電話をかけると、問題が発生する可能性があります。したがって、ここでゼロにリセットすることをお勧めします

    contFiles = 0;    // Reset variable to prevent overflow 
    var files = new List<string>();
    Action<string> getFilesInDir = null;
    getFilesInDir = new Action<string>(dir =>
    { ...
于 2013-05-20T19:08:42.357 に答える