Waiting for system to delete file

后端 未结 7 651
野的像风
野的像风 2020-12-06 00:12

I had a problem with refreshing file list after deleting a file. When I gave command to delete file, the exception was thrown because the refresh method tried to access a fi

相关标签:
7条回答
  • 2020-12-06 00:24

    Lightweight code to use a FileSystemWatcher, subscribe to its Deleted event and wait.

    void DeleteFileAndWait(string filepath, int timeout = 30000)
    {
        using (var fw = new FileSystemWatcher(Path.GetDirectoryName(filepath), Path.GetFileName(filepath)))
        using (var mre = new ManualResetEventSlim())
        {
            fw.EnableRaisingEvents = true;
            fw.Deleted += (object sender, FileSystemEventArgs e) =>
            {
                mre.Set();
            };
            File.Delete(filepath);
            mre.Wait(timeout);
        }
    }
    
    0 讨论(0)
  • 2020-12-06 00:32

    The most elegant way I can think of is using a FileSystemWatcher and subscribe to its Deleted event.

    0 讨论(0)
  • 2020-12-06 00:36

    This works for me:

    public static void DeleteFile(String fileToDelete)
    {
        var fi = new System.IO.FileInfo(fileToDelete);
        if (fi.Exists)
        {
            fi.Delete();
            fi.Refresh();
            while (fi.Exists)
            {    System.Threading.Thread.Sleep(100);
                 fi.Refresh();
            }
        }
    }
    

    I find that most of the time, the while loop will not be entered.

    0 讨论(0)
  • 2020-12-06 00:36

    Directory.Delete will throw an exception on the first error it encounters. If you want to continue deleting as many files and subdirectories as you can then you shouldn't use Directory.Delete and should write your own recursive delete with try/catch blocks inside the loops. An example when you might want to do that is if you are trying to cleanup temp files and one of the files has been locked.

    0 讨论(0)
  • 2020-12-06 00:37

    Deleting a directory using Directory.Delete, specifically the overload that takes a 'recursive' boolean, on NTFS, should be an atomic operation from your program's perspective. No need to recurse manually yourself.

    0 讨论(0)
  • 2020-12-06 00:40

    I always used this:

    System.GC.Collect();
    System.GC.WaitForPendingFinalizers();
    

    See here and here

    0 讨论(0)
提交回复
热议问题