2016-11-24 79 views
0

研究了有關此異常的許多主題,但沒有運氣。我的簡單代碼:當我嘗試刪除正在使用的文件時,C#程序凍結

  string t = Path.GetTempFileName(); 
      t = t.Remove(t.Length - 11, 11); 
      var q = Directory.EnumerateFiles(t, "tmp????.tmp"); 

      var f = q.ToList(); 
      for (int i = 0; i < q.Count(); i++) 
      { 
       //  if (Helper.CanReadFile(f[i])) 
       try 
       { 
        File.Delete(f[i]); 
       } 
       catch (IOException) 
       { 

        break; 
       } 

      } 

我在mainwindow的Closing事件中運行此代碼。 因此,它刪除了幾個文件,進入異常,然後到「break」語句,然後..在某處。只是凍結和暫停調試器導致什麼都沒有。我嘗試了幾段代碼來查找在刪除之前是否使用了該文件,但是它在該代碼中獲得了一個異常(如Helper.CanReadFile)並暫停了該程序的流程。 我真的不得不刪除所有文件,但我需要停止凍結。我該如何處理這個異常,以免凍結我的程序?

一些編輯與大多數斷點和信息。

1)有一個例外http://imgur.com/a/k6of3

2)從它的第一步驟中,沒有什麼http://imgur.com/a/FvWjz

3)回到處理http://imgur.com/a/LMdiA

4)回到事件方法http://imgur.com/a/FlIUf

5)這是從onclose http://imgur.com/a/YQUrZ

6)之後,它在這裏循環了一段時間(我使用全局熱鍵)http://imgur.com/a/0qjdf它在msg = 130〜10循環後熄滅,如果刪除文件刪除部分,我的程序會關閉。

7)凍結部分(無代碼運行消息)http://imgur.com/a/WeEGj

+0

「的話..某處」。你必須調查。在break語句中放置一個斷點,然後在調試器中一步一步地去做 –

+1

反正break語句是什麼?你真的想停止刪除所有文件,只是因爲刪除任何失敗? – nozzleman

+0

@nozzleman:你確實是對的。我們無法刪除特定文件,但這並不意味着要跳過所有剩餘的文件... –

回答

0

當刪除文件,你可以試試這個:

主題,你可以做幾件事情上運行一個後臺驗證碼更改爲private async Task DeleteAllTempFiles()並將其稱爲而不需要等待!

OR

new Thread(() => { DeleteAllTempFiles(); }).Start();

private void DeleteAllTempFiles() 
{ 
    try 
    { 
     //Get the temp Path 
     DirectoryInfo tempDir = new DirectoryInfo(Path.GetTempPath()); 
     //Get all matching files 
     List<FileInfo> tempFiles = tempDir.GetFiles("tmp????.tmp", SearchOption.AllDirectories).ToList(); 

     //Collect all files that fail to delete 
     List<FileInfo> cannotDelete = new List<FileInfo>(); 

     //Delete Files: 
     DeleteFiles(tempFiles, out cannotDelete); 

     //Show what failed (and retry or whatever) 
     string message = "Cannot delete the following file(s):"; 
     cannotDelete.ForEach(file => message += "{file.FullName}{Environment.NewLine}"); 
     MessageBox.Show(message, "Result"); 
    } 
    catch (Exception ex) 
    { 
     Debug.Fail(ex.Message); 
    } 
} 

private void DeleteFiles(List<FileInfo> filesToDelete, out List<FileInfo> failedToDelete) 
{ 
    foreach(FileInfo file in filesToDelete) 
    { 
     try 
     { 
     file.Delete(); 
     } 
     catch (IOException ioEx) 
     { 
     failedToDelete?.Add(file); //<-- Check if failedToDelete != null !!! 
     //This will always happen. 
     //Since its not "hard fail" you should log it but keep goin ! 
     //MessageBox.Show($"IO-Exception: {ioEx.Message}"); 
     } 
     catch (Exception ex) 
     { 
     MessageBox.Show($"Exception: {ex.Message}"); 
     } 
    } 
} 

如果你想用文件來工作,你不能刪除,你可以在這個過程中他們:How do I find out which process is locking a file using .NET?

對於一個快速檢查什麼鎖您可以使用的文件:OpenedFilesViewWindows Sysinternals Process Explorer

也許你可以嘗試設置一些屬性...也許你可以用這種訪問:

enter image description here

對不起,圖像的大小不好..

+0

好吧,它試圖刪除文件,不能刪除其中的3個,顯示Msgbox ioexception infos(this line - > //MessageBox.Show ($"IO-Exception:{ioEx.Message}「);),然後顯示帶有3個名字的結果,然後我的屏幕顯示爲http://imgur.com/a/WeEGj。我覺得這個未刪除文件的工作做得不好,但不知道究竟是什麼。 – user1193962

+0

好的,我粘貼了鏈接中的代碼,它顯示只有我的程序正在使用該文件。像這樣:foreach(outList中的var fileInfo) var z = FileUtil.WhoIsLocking(fileInfo.FullName); string t =「」; z.ForEach(pr => t + = pr.ProcessName); MessageBox.Show(t); }我看到「myProgramName.vshost」 – user1193962

+0

好的。但是,爲什麼要刪除文件Visual Studio在調試時創建** temporary **?它像破壞你自己的程序... –

相關問題