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
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);
}
}
The most elegant way I can think of is using a FileSystemWatcher and subscribe to its Deleted
event.
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.
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.
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.
I always used this:
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
See here and here