0

我有一个问题,我编写了一个应用程序,该应用程序将遍历文件并将每个文件的整数添加 +1,直到它达到特定的文件名。问题可能是因为 .Net 不直接访问本机文件系统,它填满了集合,但在我的情况下,相信我,这需要数年时间,我在目标文件夹中有 260 000 个文件。迭代甚至没有到达第二个文件。线程完全冻结,没有错误,没有异常。那么有什么方法可以直接访问本机文件系统而不会填充任何无用的集合?

这是我的代码:

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        foreach (string file in Directory.GetFiles("\\\\Mypcname-PC\\vxheaven\\malware"))
        {
            count++;
            label1.Text = Convert.ToString(count);
            if (file.Contains(textBox1.Text))
            {
                label1.Text = Convert.ToString(count) + " reached the file";
                break;
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

顺便提一句。对不起,我的英语不好

问候

4

2 回答 2

10

因为您正在 UI 线程上完成所有工作,所以它在工作时无法刷新。您需要在后台线程上完成工作,然后以线程安全的方式更新 UI。切换到Directory.EnumerateFiles也可以更快地读取第一个文件,因此不需要将所有记录存储到数组中。最后我改为ex.Messageex.ToString()它会以这种方式显示更多有用的信息。

private async void button1_Click(object sender, EventArgs e)
{
    try
    {
         var text = textBox1.Text;
         var progress = new Progress<string>((x) => label1.Text = x);
         await Task.Run(() => DoWork(progress, text));
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

private void DoWork(IProgress<string> progress, string text)
{
    foreach (string file in Directory.EnumerateFiles("\\\\Mypcname-PC\\vxheaven\\malware"))
    {
        count++;
        progress.Report(Convert.ToString(count));
        if (file.Contains(text))
        {
            progress.Report(Convert.ToString(count) + " reached the file");
            break;
        }
    }
}

(代码是从内存中写在网络浏览器中的,所以可能会有错误)

于 2016-06-28T18:36:36.470 回答
-1

似乎您正在使用一个可能非常耗时的循环而不处理 Windows 消息队列,因此您的应用程序可能会被冻结,而它可能只是忙于执行您指示它在循环中执行的操作。尝试这个:

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        foreach (string file in Directory.GetFiles("\\\\Mypcname-PC\\vxheaven\\malware"))
        {
            count++;
            label1.Text = Convert.ToString(count);
            Application.DoEvents();
            if (file.Contains(textBox1.Text))
            {
                label1.Text = Convert.ToString(count) + " reached the file";
                break;
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
于 2016-06-28T18:41:16.810 回答