2016-11-24 78 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 **?它像破坏你自己的程序... –

相关问题