private void AppendDirectoryCore(StoragePath source, StoragePath level) { // Copy each file into the new directory. foreach (var file in Directory.EnumerateFiles(source.ToString()).Select(x => new StoragePath(x))) { this.AddExisting(level + file.Name, file); } // Copy each subdirectory using recursion. foreach (var sub in Directory.EnumerateDirectories(source.ToString()).Select(x => new StoragePath(x))) { this.AddDirectory(level + sub.Name); AppendDirectoryCore(sub, level + sub.Name); } }
private void DeleteDirectoryCore(StoragePath source, StoragePath level) { // Delete each file in the directory. foreach (string file in Directory.EnumerateFiles(source.ToString())) { File.Delete(file); } // Delete each subdirectory using recursion. foreach (var sub in Directory.EnumerateDirectories(source.ToString()).Select(x => new StoragePath(x))) { DeleteDirectoryCore(sub, level + sub.Name); } Directory.Delete(source.ToString()); }
/// <summary> /// Runs all operations on the target directory asynchronously /// </summary> public async Task BuildAsync() { if (!Directory.Exists(this.RootDirectory.ToString())) { Directory.CreateDirectory(this.RootDirectory.ToString()); } // Delete files and folders foreach (var item in this.deletions) { if (File.Exists(item.ToString())) { File.Delete(item.ToString()); } else { this.DeleteDirectoryCore(item, new StoragePath()); } } // Build existing directories foreach (var item in this.existing) { AppendDirectoryCore(item.Item2, item.Item1); } this.existing.Clear(); // Read all zip files foreach (var item in this.zips) { using (item) { foreach (var entry in item.Entries) { var stream = entry.Open(); this.AppendFile(entry.FullName, () => stream); } } } this.zips.Clear(); // Build directories foreach (var item in this.directories) { string dir = this.RootDirectory.Combine(item).ToString(); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } } ; this.directories.Clear(); // Build files foreach (var item in this.filesToBuild) { async Task WriteFile(string p, FileMode mode) { using (FileStream writer = new FileStream(p, mode)) { using (var reader = item.Stream) { await reader.CopyToAsync(writer); } await writer.FlushAsync(); } } StoragePath path = this.RootDirectory + item.Path; string dir = path.ParentDirectory.ToString(); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } bool targetExists = File.Exists(path.ToString()); if (this.ConflictResolution == NameConflictOption.ThrowException && targetExists) { throw new IOException($"The file '{Path.GetFileName(path.ToString())}' already exists"); } else if (this.ConflictResolution == NameConflictOption.Skip && targetExists) { continue; } else if (this.ConflictResolution == NameConflictOption.Rename && targetExists) { await WriteFile(ResolveFileName(path.ToString()), FileMode.Create); } else { await WriteFile(path.ToString(), FileMode.Create); } } ; this.filesToBuild.Clear(); }