void PurgeDirectory(string targetDirectory, Predicate <IFileInfo> include, DeletionOptions options, CancellationToken cancel, bool includeTarget = false) { if (!DirectoryExists(targetDirectory)) { return; } foreach (var file in EnumerateFiles(targetDirectory)) { cancel.ThrowIfCancellationRequested(); if (include != null) { var info = new FileInfoAdapter(new FileInfo(file)); if (!include(info)) { continue; } } DeleteFile(file, options); } foreach (var directory in EnumerateDirectories(targetDirectory)) { cancel.ThrowIfCancellationRequested(); var info = new DirectoryInfo(directory); if ((info.Attributes & FileAttributes.ReparsePoint) == FileAttributes.ReparsePoint) { Directory.Delete(directory); } else { PurgeDirectory(directory, include, options, cancel, includeTarget: true); } } if (includeTarget && DirectoryIsEmpty(targetDirectory)) { DeleteDirectory(targetDirectory, options); } }
public void DeleteFile(string path, DeletionOptions options) { options = options ?? DeletionOptions.TryThreeTimes; if (string.IsNullOrWhiteSpace(path)) { return; } var firstAttemptFailed = false; for (var i = 0; i < options.RetryAttempts; i++) { try { if (File.Exists(path)) { if (firstAttemptFailed) { File.SetAttributes(path, FileAttributes.Normal); } File.Delete(path); } } catch { Thread.Sleep(options.SleepBetweenAttemptsMilliseconds); firstAttemptFailed = true; if (i == options.RetryAttempts - 1) { if (options.ThrowOnFailure) { throw; } break; } } } }
public void DeleteDirectory(string path, DeletionOptions options) { options = options ?? DeletionOptions.TryThreeTimes; if (string.IsNullOrWhiteSpace(path)) { return; } for (var i = 0; i < options.RetryAttempts; i++) { try { if (Directory.Exists(path)) { var dir = new DirectoryInfo(path); dir.Attributes = dir.Attributes & ~FileAttributes.ReadOnly; dir.Delete(true); } } catch { Thread.Sleep(options.SleepBetweenAttemptsMilliseconds); if (i == options.RetryAttempts - 1) { if (options.ThrowOnFailure) { throw; } break; } } } }
public void PurgeDirectory(string targetDirectory, Predicate <IFileInfo> include, DeletionOptions options) { PurgeDirectory(targetDirectory, include, options, CancellationToken.None); }
public void PurgeDirectory(string targetDirectory, DeletionOptions options, CancellationToken cancel) { PurgeDirectory(targetDirectory, fi => true, options, cancel); }
public void PurgeDirectory(string targetDirectory, DeletionOptions options) { PurgeDirectory(targetDirectory, fi => true, options); }