2011-03-30 72 views
1

我有這種刪除文件列表的簡單方法。但是在某些情況下,除非我給它睡眠幾秒鐘,否則它將無法刪除文件。這是顯而易見的,尤其是當我合併使用Interop的Word文檔,然後執行合併後,我嘗試刪除它們中的一部分文件(但我猜Word仍然在後臺)。在c中刪除文件的方法#

你會怎麼做這個?有它異步,並使其產卵,將開始一段時間後刪除文件線程(有點像垃圾回收器?)

public static void deleteDocuments(List<string> arrayList) { 
     foreach (var item in arrayList) { 
      try { 
       File.Delete(item); 
      } catch (Exception e) { 
       MessageBox.Show("Błąd kasowania: " + e.ToString(), "Błąd Kasowania", MessageBoxButtons.OK, MessageBoxIcon.Error); 

      } 
     } 
    } 

回答

1

我同意,這個問題應該在計算器上,但我沒有名氣來移動它,所以我會添加一個可能的答案,然後如果它移動了,你可能會得到更好的答案。 你可以這樣做:

public static void deleteDocuments(List<string> arrayList) 
{ 
    int maxRetries = 50; 
    foreach (var item in arrayList) 
    { 
     bool retry = false; 
     int retryCount = 0; 
     do 
     { 
      try 
      { 
       File.Delete(item); 
      } 
      catch(IOException ex) 
      { 
       // This indicates file is in use, so sleep for 
       // half second and retry 
       retryCount++; 
       if (retryCount < maxRetries) 
       { 
        System.Threading.Thread.Sleep(500); 
        retry = true; 
       } 
       else 
       { 
        MessageBox.Show("Błąd kasowania: " + e.ToString(), 
         "Błąd Kasowania", MessageBoxButtons.OK, 
         MessageBoxIcon.Error); 
       } 
      } 
      catch (Exception e) 
      { 
       MessageBox.Show("Błąd kasowania: " + e.ToString(), 
        "Błąd Kasowania", MessageBoxButtons.OK, 
        MessageBoxIcon.Error); 
      } 
     } 
     while(retry) 
    } 
} 
+0

這將阻塞線程,直到文件被刪除。如果文件始終被鎖定,會發生什麼?我建議添加一個計數器,以最大限度地嘗試刪除文件 – 2011-03-30 14:22:27

+0

你是對的,我很快就寫了,並沒有考慮到所有這一切。在我自己的代碼中,我不得不偶爾做一些這樣的事情,我限制了重試的次數。我將編輯代碼。 – pstrjds 2011-03-30 14:34:21

+0

如果文件列表很長,並且有一個阻塞等待文件被刪除,gui將變得無響應。 – MadBoy 2011-03-30 15:01:53