C# - 删除文件夹

时间:2012-09-18 14:09:49

标签: c# winapi io

我想用C#删除java文件夹, 但我没有什么问题。

这是代码

private void setDebug(string value)
{
    debug.Text = value;
}

private void buildButton_Click(object sender, EventArgs e)
{
    // delete java folder
    string java_folder = @"C:\Program Files\Java";
    if (Directory.Exists(java_folder))
    {
        setDebug("Deleting Java folder...");
        Directory.Delete(java_folder, true);
        progressBar.Value += 10;
    }
}

当我点击按钮时程序卡住,但是当我删除行Directory.Delete时 它将调试标签更改为“删除java文件夹...”

我知道该程序因为删除了文件夹而停滞不前,但我希望它在删除文件夹之前先更改调试。

该怎么办?谢谢你的帮助:)

2 个答案:

答案 0 :(得分:3)

您的代码似乎无法正常工作的原因是WinForms处理UI更新的方式。

在方法buildButton_Click完成之前,UI不会重新绘制 - 在此之前UI也不会响应。 Directory.Delete行需要花费很长时间才能运行,因此您的程序会“粘住”并且您看不到调试标签。

您需要做的是研究使用线程 - 阅读线程,任务或BackgroundWorker类,以了解它们的工作原理。然后,不要直接在方法中调用Directory.Delete,而是使用其中一种技术在后台线程上运行删除。

答案 1 :(得分:1)

您需要将代码包装在不同的线程中,如下所示:

private void setDebug(string value)
{
    debug.Text = value;
}

private void buildButton_Click(object sender, EventArgs e)
{
    BackgroundWorker worker = new BackgroundWorker();
    string java_folder = @"C:\Program Files\Java";
    if (Directory.Exists(java_folder))
    {
        setDebug("Deleting Java folder...");
        worker.DoWork += (s, args) => // this is the off-thread code
        {
            // delete java folder
            Directory.Delete(java_folder, true);
        };
        worker.RunWorkerCompleted += (s,args)=>  // this goes off when .DoWork is done
        {
            progressBar.Value += 10; 
        };

        // this invokes .DoWork handler (which we defined above)
        worker.RunWorkerAsync();
    }
}