当我尝试删除正在使用的文件时,C#程序会冻结

时间:2016-11-24 11:42:08

标签: c# file path freeze ioexception

研究了很多关于这个例外的话题,没有运气。我的简单代码:

            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;
                }

            }

我在主窗口的Closing事件中运行了此代码。 所以它删除了几个文件,进入异常,然后到#34; break&#34;声明,然后......某处。只是冻结和暂停调试器导致什么都没有。我尝试了几段代码来查找文件是否在删除之前使用,但它在此代码中得到一个异常(如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它会在~10循环后消失,msg = 130.如果删除文件删除部分,我的程序会正常关闭。

7)冻结部分(没有代码正在运行消息)http://imgur.com/a/WeEGj

1 个答案:

答案 0 :(得分:0)

删除文件时,您可以尝试:

要在后台线程上运行此代码,您可以执行以下操作:

更改为private async Task DeleteAllTempFiles()并将其命名为,不等待!

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

很抱歉图片尺寸不合适..