等待系统删除文件

kr8*_*r85 16 c# filesystems multithreading delete-file

删除文件后刷新文件列表时出现问题.当我命令删除文件时,抛出了异常,因为刷新方法试图访问应该删除的文件.

经过一番思考和调试后,我得出结论,问题在于系统需要一些时间来删除文件.我这样解决它:

//Deleting file
System.Threading.Thread.Sleep(2000);
//Refreshing list
Run Code Online (Sandbox Code Playgroud)

它工作得很好.

我的问题是

是否有更优雅的方式等待系统删除文件,然后继续代码...?

小智 14

这对我有用:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我发现大多数时候,不会输入while循环.


GET*_*Tah 6

我能想到的最优雅的方法是使用FileSystemWatcher并订阅它的Deleted事件.

  • 如果这是在NFS分区上,正如我怀疑的那样,那么FileSystemWatcher可能不可靠:http://stackoverflow.com/questions/239988/filesystemwatcher-vs-polling-to-watch-for-changes (3认同)

JPK*_*JPK 6

轻量级代码使用FileSystemWatcher,订阅其Deleted事件并等待。

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);
    }
}
Run Code Online (Sandbox Code Playgroud)