using System; using System.IO; using System.IO.Compression; using System.Linq; using System.Net; using System.Text; using System.Text.RegularExpressions; using System.Xml; using System.Xml.Linq; using System.Xml.Serialization; namespace Scripts { public static class FileHelper { public static void DeleteSubDirectoriesOtherThan(string directory, params string[] allowedSubDirectories) { var allowedSubDirectoriesFullPaths = allowedSubDirectories.Select(f => Path.Combine(directory, f)).ToList(); var allSubDirectories = Directory.GetDirectories(directory); foreach (var subDirectory in allSubDirectories) { if (allowedSubDirectoriesFullPaths.Contains(subDirectory) == false) { DeleteDirectory(subDirectory); } } } public static void DeleteDirectory(string directory) { if (Directory.Exists(directory) == false) return; Directory.Delete(directory, recursive: true); } public static void MoveDirectory(string fromDirectory, string toDirectory) { MoveFiles(fromDirectory, toDirectory, "*.*"); } public static void MoveFiles(string fromDirectory, string toDirectory, string filePattern = "*.*", SearchOption searchOption = SearchOption.AllDirectories, bool skipAlreadyExistingFiles = false) { MoveOrCopyFilesInternal((file, targetFile) => File.Move(file, targetFile), fromDirectory, toDirectory, filePattern, searchOption, skipAlreadyExistingFiles); } public static void CopyFiles(string fromDirectory, string toDirectory, string filePattern = "*.*", SearchOption searchOption = SearchOption.AllDirectories, bool skipAlreadyExistingFiles = false) { MoveOrCopyFilesInternal((file, targetFile) => File.Copy(file, targetFile), fromDirectory, toDirectory, filePattern, searchOption, skipAlreadyExistingFiles); } private static void MoveOrCopyFilesInternal(Action action, string fromDirectory, string toDirectory, string filePattern = "*.*", SearchOption searchOption = SearchOption.AllDirectories, bool skipAlreadyExistingFiles = false) { if (Directory.Exists(toDirectory) == false) Directory.CreateDirectory(toDirectory); foreach (var file in Directory.GetFiles(fromDirectory, filePattern, searchOption)) { var targetFile = file.Replace(fromDirectory, toDirectory, StringComparison.Ordinal) ?? string.Empty; var targetDirectory = Path.GetDirectoryName(targetFile) ?? string.Empty; if (Directory.Exists(targetDirectory) == false) Directory.CreateDirectory(targetDirectory); if (skipAlreadyExistingFiles && File.Exists(targetFile)) continue; action(file, targetFile); } } public static void DeleteFiles(string directory, string filePattern) { foreach (var file in Directory.GetFiles(directory, filePattern)) { File.Delete(file); } } public static void RenameFile(string directory, string fileName, string newFileName) { File.Move(Path.Combine(directory, fileName), Path.Combine(directory, newFileName)); } public static void ZipDirectory(string directory, string outputFilePath) { if (File.Exists(outputFilePath)) File.Delete(outputFilePath); var outputDirectory = Path.GetDirectoryName(outputFilePath) ?? throw new ArgumentException("Invalid output filepath.", nameof(outputFilePath)); if (Directory.Exists(outputDirectory) == false) Directory.CreateDirectory(outputDirectory); ZipFile.CreateFromDirectory(directory, outputFilePath); } public static void ZipSingleFile(string file, string outputFilePath) { var tempDirectory = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N")); Directory.CreateDirectory(tempDirectory); var targetFilePath = Path.Combine(tempDirectory, Path.GetFileName(file)); File.Move(file, targetFilePath); ZipDirectory(tempDirectory, outputFilePath); Directory.Delete(tempDirectory, recursive: true); } public static void ExtractZip(string archive, string directory) { ZipFile.ExtractToDirectory(archive, directory); } } }