public static void WipeFolder(string baseDir) { DirectoryInfo dirInfo = new DirectoryInfo(baseDir); if (!dirInfo.Exists) { return; } RecursiveDelete(dirInfo); if (!Directory.EnumerateFileSystemEntries(dirInfo.FullName).Any()) { try { dirInfo.Delete(); } catch { HandleUtil.KillProcessesUsingFile(dirInfo.FullName); Thread.Sleep(500); try { dirInfo.Delete(); } catch { // We've tried for long enough... } } } }
public static void DeleteFile(FileInfo file) { if (!file.Exists) { return; } try { file.IsReadOnly = false; file.Delete(); } catch { for (int i = 0; i < 10; ++i) { try { TakeOwnership(file.FullName); file.IsReadOnly = false; file.Delete(); return; } catch { // Try again after sleeping. Thread.Sleep(500); } } HandleUtil.KillProcessesUsingFile(file.FullName); Thread.Sleep(500); file.Delete(); } }
public static void RecursiveDelete(DirectoryInfo rootDir, DirectoryInfo baseDir, string filename) { if (!baseDir.Exists) { return; } if (!baseDir.FullName.StartsWith(rootDir.FullName)) { // Sanity check. return; } foreach (DirectoryInfo dir in baseDir.EnumerateDirectories()) { RecursiveDelete(rootDir, dir, filename); } foreach (FileInfo file in baseDir.GetFiles()) { if (!file.FullName.StartsWith(rootDir.FullName)) { // Sanity check. continue; } if (filename == null || file.Name.Equals(filename)) { DeleteFile(file); } } if (!Directory.EnumerateFileSystemEntries(baseDir.FullName).Any()) { try { baseDir.Delete(); } catch { HandleUtil.KillProcessesUsingFile(baseDir.FullName); baseDir.Delete(); } } }