build/FileHelpers.cs (119 lines of code) (raw):

using System.Collections.Generic; using System.IO; using System.IO.Compression; namespace Build { public static class FileHelpers { public static void EnsureDirectoryExists(string dirPath) { if (!Directory.Exists(dirPath)) { Directory.CreateDirectory(dirPath); } } // https://docs.microsoft.com/en-us/dotnet/standard/io/how-to-copy-directories public static void RecursiveCopy(string sourcePath, string destinationPath) { // Get the subdirectories for the specified directory. var dir = new DirectoryInfo(sourcePath); if (!dir.Exists) { throw new DirectoryNotFoundException( "Source directory does not exist or could not be found: " + sourcePath); } var dirs = dir.GetDirectories(); // If the destination directory doesn't exist, create it. if (!Directory.Exists(destinationPath)) { Directory.CreateDirectory(destinationPath); } // Get the files in the directory and copy them to the new location. var files = dir.GetFiles(); foreach (var file in files) { var temppath = Path.Combine(destinationPath, file.Name); file.CopyTo(temppath, false); } // If copying subdirectories, copy them and their contents to new location. foreach (var subdir in dirs) { var temppath = Path.Combine(destinationPath, subdir.Name); RecursiveCopy(subdir.FullName, temppath); } } public static IEnumerable<string> ExpandFileWildCardEntries(IEnumerable<string> filesAndDirs) { var allEntries = new List<string>(); foreach (var entry in filesAndDirs) { if (entry.Contains("*")) { var files = Directory.GetFiles(Path.GetDirectoryName(entry), Path.GetFileName(entry), SearchOption.AllDirectories); allEntries.AddRange(files); } else { allEntries.Add(entry); } } return allEntries; } public static IEnumerable<string> GetAllFilesFromFilesAndDirs(IEnumerable<string> filesAndDirs) { var allFiles = new List<string>(); foreach (var entry in filesAndDirs) { // Just in case if the file we need to sign does not exist anymore or in this build if (!Directory.Exists(entry) && !File.Exists(entry)) { continue; } FileAttributes attr = File.GetAttributes(entry); if (attr.HasFlag(FileAttributes.Directory)) { var files = Directory.GetFiles(entry, "*", SearchOption.AllDirectories); allFiles.AddRange(files); } else { allFiles.Add(entry); } } return allFiles; } public static void CopyFileRelativeToBase(string sourceFilePath, string targetDirectory, string baseDirectory) { string relativePath = Path.GetRelativePath(baseDirectory, sourceFilePath); string fullFilePath = Path.Combine(targetDirectory, relativePath); string directoryPath = Path.GetDirectoryName(fullFilePath); Directory.CreateDirectory(directoryPath); File.Copy(sourceFilePath, fullFilePath); } public static void CreateZipFile(IEnumerable<string> files, string baseDir, string zipFilePath) { using (var zipfile = ZipFile.Open(zipFilePath, ZipArchiveMode.Create)) { foreach (var file in files) { zipfile.CreateEntryFromFile(file, Path.GetRelativePath(baseDir, file)); } } } public static void ExtractZipFileForce(string zipFile, string to) { using (var archive = ZipFile.OpenRead(zipFile)) { foreach (ZipArchiveEntry file in archive.Entries) { string destFileName = Path.GetFullPath(Path.Combine(to, file.FullName)); string fullDestDirPath = Path.GetFullPath(to + Path.DirectorySeparatorChar); if (!destFileName.StartsWith(fullDestDirPath)) { throw new System.InvalidOperationException("Entry is outside the target dir: " + destFileName); } file.ExtractToFile(destFileName, overwrite: true); } } } public static void ExtractZipToDirectory(string zipFile, string to) { ZipFile.ExtractToDirectory(zipFile, to); } } }