private async Task AddAllFilesToArchive(ZipArchive archive, string directoryFullPath, IProgress <uint> progressReport) { var subDirectories = new List <string>(Directory.EnumerateDirectories(directoryFullPath)); for (int i = 0; i < subDirectories.Count; i++) { await AddAllFilesToArchive(archive, subDirectories[i], null).ConfigureAwait(false); progressReport?.Report(ProgressHelper.ComputeProgressPercentage((uint)i, (uint)subDirectories.Count + 1)); } foreach (var file in Directory.EnumerateFiles(directoryFullPath)) { if (IsDatabaseLock(file)) { continue; } string entryPath = CreateRelativePath(file); var entry = archive.CreateEntry(entryPath, CompressionLevel.Optimal); using (var entryStream = entry.Open()) { using (var fileStream = File.OpenRead(file)) await fileStream.CopyToAsync(entryStream).ConfigureAwait(false); } } progressReport?.Report(100); }
public async Task ExecuteAsync(IProgress <uint> progressReport) { for (int i = 0; i < _backupFile.Entries.Count; i++) { var entry = _backupFile.Entries[i]; if (IsCanary(entry.Name)) { continue; } string entryFullPath = Path.Combine(_targetDirectory, entry.FullName); EnsureFileCanBeWritten(entryFullPath); using (var fileStream = File.Open(entryFullPath, FileMode.Create, FileAccess.Write, FileShare.None)) { using (var entryStream = entry.Open()) await entryStream.CopyToAsync(fileStream); } if (i % PROGRES_REPORT_FILE_COUNT == 0 || i == _backupFile.Entries.Count) { progressReport?.Report(ProgressHelper.ComputeProgressPercentage((uint)i, (uint)_backupFile.Entries.Count)); } } }