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="索引超出范围。它必须是非负数并且小于集合的大小。参数名称:索引"

Source="mscorlib" ParamName="index" StackTrace:在 System.Windows.Forms.ToolStripItemCollection.get_Item(Int32 索引)中的 System.Collections.ArrayList.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.Control.ControlNativeWindow 中的 Windows.Forms.ToolStrip.WndProc(Message& m) System.Windows.Forms.NativeWindow 中的 System.Windows.Forms.StatusStrip.WndProc(Message& m)。 DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) InnerException:

编辑

阅读程序的整个代码后,我注意到该函数正在 Do_Work 中调用,所以我使用的是

backgroundWorker2.ReportProgress((1));

报告aa并且一切正常。

我不知道为什么,但不知何故,即使在 backgroundWorker、标签和其他控件中也可以访问 toolStripItem。

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 回答