2012-09-18 60 views
-2

我想用C#刪除java文件夾, 但我沒有問題。C# - 刪除文件夾

這是代碼

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文件夾...」

我知道該程序卡住了,因爲它刪除了該文件夾,但我希望它在刪除該文件夾之前首先更改調試。

該怎麼辦?感謝您的幫助:)

回答

3

您的代碼似乎沒有工作的原因是因爲WinForms處理UI更新的方式。

在您的方法buildButton_Click完成之前,用戶界面將不會重新繪製 - 而且在此之前UI也不會響應。 Directory.Delete行是需要很長時間才能運行的,因此您的程序「堅持」而您看不到調試標籤。

您需要做的就是使用線程進行研究 - 閱讀線程,任務或BackgroundWorker類,以瞭解它們的工作方式。然後,不要直接在方法中調用Directory.Delete,而要使用其中一種技術在後臺線程上運行刪除。

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(); 
    } 
} 
+0

感謝兄弟,真的多幫我:) –

+0

不客氣。如果它解決了您的問題,請隨時將其標記爲已接受,以便未來的訪問者知道它在相同的情況下很有用。 – Alex

+0

哦,它告訴我「一個名爲'桑德'的局部變量不能在範圍內聲明,因爲它會給'發件人'一個不同的含義,這是'父'或當前'範圍中用來表示別的東西的代碼。」 –