using System; using System.IO; using System.IO.Compression; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Xml; using System.Xml.Linq; using System.Xml.Serialization; namespace Centron.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 (string file in Directory.GetFiles(fromDirectory, filePattern, searchOption)) { var relativePath = Path.GetRelativePath(fromDirectory, file); var targetFile = Path.Combine(toDirectory, relativePath); var targetDirectory = Path.GetDirectoryName(targetFile); 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); if (Directory.Exists(outputDirectory) == false) Directory.CreateDirectory(outputDirectory); ZipFile.CreateFromDirectory(directory, outputFilePath); } public static void ExtractZip(string archive, string directory) { ZipFile.ExtractToDirectory(archive, directory); } public static void FixNLogConfig(string directory) { var nlogConfigPath = Path.Combine(directory, "nlog.config"); var document = XDocument.Load(nlogConfigPath); var loggerElements = document.Root .Element(XName.Get("rules", "http://www.nlog-project.org/schemas/NLog.xsd")) .Elements(XName.Get("logger", "http://www.nlog-project.org/schemas/NLog.xsd")); foreach (var logger in loggerElements) { logger.SetAttributeValue("minLevel", "WARN"); } document.Save(nlogConfigPath, SaveOptions.None); } public static void FixNLogConfigRiverbirdPath(string directory) { var nlogConfigPath = Path.Combine(directory, "nlog.config"); var document = XDocument.Load(nlogConfigPath); var variables = document.Root .Elements(XName.Get("variable", "http://www.nlog-project.org/schemas/NLog.xsd")); foreach (var variable in variables) { if (!variable.Attribute("name").Value.Equals("logDirectory", StringComparison.InvariantCultureIgnoreCase)) continue; variable.SetAttributeValue("value", "${specialfolder:folder=CommonApplicationData}/Riverbird/Riverbird Web-Service/Logs"); } document.Save(nlogConfigPath, SaveOptions.None); } public static void UpdateVersionInfo(string path, string version, string commitId, bool isDevBuild) { var buildProps = XElement.Load(path); var propGroup = buildProps.Elements("PropertyGroup").First(); propGroup.Element("IsDevBuild").SetValue(isDevBuild); propGroup.Element("Version").SetValue(version); propGroup.Element("GitCommitId").SetValue(commitId); buildProps.Save(path); } } }