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

当我试图删除正在使用的文件时,C#程序冻结,c#,file,path,freeze,ioexception,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 <

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

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

            }
string t=Path.GetTempFileName();
t=t.Remove(t.Length-11,11);
var q=目录.EnumerateFiles(t,“tmp???.tmp”);
var f=q.ToList();
对于(int i=0;i
我在主窗口关闭事件中运行了此代码。 所以它删除几个文件,进入异常,然后执行“break”语句,然后。。某处。只是冻结和暂停调试器不会导致任何结果。我尝试了几段代码,以确定删除之前是否使用了该文件,但它在该代码中出现异常(如Helper.CanReadFile),并停止了那里的程序流我真的不必删除所有文件,但我需要停止冻结。如何处理此异常,使其不会冻结我的程序

有些人用断点和大多数断点的信息进行编辑

1) 有个例外

2) 第一步,没什么大不了的

3) 回去处理

4) 返回到事件方法

5) 从onclose打过来的

6) 在此之后,它在这里循环了一段时间(我使用全局热键),在大约10次循环后,它会关闭,msg=130。如果我删除文件删除部分,我的程序会正常关闭


7) 冻结部分(没有代码正在运行消息)

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

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

更改为
private async Task DeleteAllTempFiles()
并调用它,无需等待

新线程(()=>{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}");
      }
   }
}
private void DeleteAllTempFiles()
{
尝试
{
//获取临时路径
DirectoryInfo tempDir=newdirectoryinfo(Path.GetTempPath());
//获取所有匹配的文件
List tempFiles=tempDir.GetFiles(“tmp???.tmp”,SearchOption.AllDirectories).ToList();
//收集所有未能删除的文件
List cannotDelete=新列表();
//删除文件:
删除文件(tempFiles,out cannotDelete);
//显示失败的内容(并重试或其他)
string message=“无法删除以下文件:”;
cannotDelete.ForEach(file=>message+=“{file.FullName}{Environment.NewLine}”);
MessageBox.Show(消息,“结果”);
}
捕获(例外情况除外)
{
调试失败(例如消息);
}
}
私有void delete文件(列表文件删除,输出列表失败删除)
{
foreach(filesToDelete中的FileInfo文件)
{   
尝试
{
Delete();
}
捕获(IOException ioEx)
{

未能删除?.Add(文件);/“然后..某处”。您必须进行调查。在break语句中放置一个断点,然后在调试程序中一步一步地执行break语句的作用是什么?是否确实要因为删除任何文件失败而停止删除所有文件?@nozzleman:您的确是对的。我们不能删除特定的文件,这并不意味着跳过所有剩余的文件…使用rmClosing。您向我们显示的方法没有开始也没有结束。我们如何知道之后会发生什么?好的,它尝试删除文件,无法删除其中的3个,显示带有ioexception信息的Msgbox(此行->//MessageBox.show($“IO异常:{ioEx.Message}”);),然后用3个名称显示结果,然后我的屏幕如下。我觉得未删除文件的某些工作没有正确完成,但不知道具体是什么。好的,我从链接粘贴了代码,它显示只有我的程序在使用该文件。例如:foreach(outList中的var fileInfo){var z=FileUtil.WhoIsLocking(fileInfo.FullName);string t=“”;z.ForEach(pr=>t+=pr.ProcessName);MessageBox.Show(t);}我看到了“myProgramName.vshost”好的。但为什么要删除Visual Studio在调试时创建的临时文件?这就像破坏了您自己的程序……这是我自己的文件:).vshost只是澄清了该进程是从visual studio启动的。我在程序运行期间创建了它们,并希望在以后删除它们。无论如何,我添加了一个对象的处理,看起来它现在可以工作了,但我仍然不知道如何正确处理此类ioexception以及为什么程序会冻结。当执行长时间操作时,程序会冻结在UI线程上执行。
GetFiles()
当seracoption.AllDirectories处于启用状态时可能需要一段时间。子目录越多,执行时间越长。您可以使用线程在后台运行它。