/// <summary> /// Получить относительные пути конфигурации, соответствующие заданным частям /// </summary> private List <RelPath> GetConfigPaths(ConfigParts configParts) { List <RelPath> configPaths = new List <RelPath>(); if (configParts.HasFlag(ConfigParts.Base)) { configPaths.Add(new RelPath(ConfigParts.Base, AppFolder.Root)); } if (configParts.HasFlag(ConfigParts.Interface)) { configPaths.Add(new RelPath(ConfigParts.Interface, AppFolder.Root)); } if (configParts.HasFlag(ConfigParts.Server)) { configPaths.Add(new RelPath(ConfigParts.Server, AppFolder.Config)); } if (configParts.HasFlag(ConfigParts.Comm)) { configPaths.Add(new RelPath(ConfigParts.Comm, AppFolder.Config)); } if (configParts.HasFlag(ConfigParts.Web)) { configPaths.Add(new RelPath(ConfigParts.Web, AppFolder.Config)); configPaths.Add(new RelPath(ConfigParts.Web, AppFolder.Storage)); } return(configPaths); }
/// <summary> /// Распаковать архив конфигурации /// </summary> public bool UnpackConfig(string srcFileName, ConfigOptions configOptions) { try { // удаление существующей конфигурации List <RelPath> configPaths = GetConfigPaths(configOptions.ConfigParts); PathDict pathDict = PrepareIgnoredPaths(configOptions.IgnoredPaths); foreach (RelPath relPath in configPaths) { ClearDir(relPath, pathDict); } // определение допустимых директорий для распаковки ConfigParts configParts = configOptions.ConfigParts; List <string> allowedEntries = new List <string>(AllConfigParts.Length); foreach (ConfigParts configPart in AllConfigParts) { if (configParts.HasFlag(configPart)) { allowedEntries.Add(DirectoryBuilder.GetDirectory(configPart, '/')); } } // распаковка новой конфигурации using (FileStream fileStream = new FileStream(srcFileName, FileMode.Open, FileAccess.Read, FileShare.Read)) { using (ZipArchive zipArchive = new ZipArchive(fileStream, ZipArchiveMode.Read)) { string instanceDir = Settings.Directory; foreach (ZipArchiveEntry entry in zipArchive.Entries) { if (StartsWith(entry.FullName, allowedEntries, StringComparison.Ordinal)) { string relPath = entry.FullName.Replace('/', Path.DirectorySeparatorChar); string destFileName = instanceDir + relPath; Directory.CreateDirectory(Path.GetDirectoryName(destFileName)); entry.ExtractToFile(destFileName, true); } } return(true); } } } catch (Exception ex) { log.WriteException(ex, Localization.UseRussian ? "Ошибка при распаковке конфигурации из архива" : "Error unpacking configuration from archive"); return(false); } }
/// <summary> /// Распаковать архив конфигурации /// </summary> public bool UnpackConfig(string srcFileName, ConfigOptions configOptions) { try { // delete the existing configuration List <RelPath> configPaths = GetConfigPaths(configOptions.ConfigParts); PathDict pathDict = PrepareIgnoredPaths(configOptions.IgnoredPaths); foreach (RelPath relPath in configPaths) { ClearDir(relPath, pathDict); } // delete a project information file string instanceDir = Settings.Directory; string projectInfoFileName = Path.Combine(instanceDir, ProjectInfoEntryName); File.Delete(projectInfoFileName); // define allowed directories to unpack ConfigParts configParts = configOptions.ConfigParts; List <string> allowedEntries = new List <string> { ProjectInfoEntryName }; foreach (ConfigParts configPart in AllConfigParts) { if (configParts.HasFlag(configPart)) { allowedEntries.Add(DirectoryBuilder.GetDirectory(configPart, '/')); } } // unpack the new configuration using (FileStream fileStream = new FileStream(srcFileName, FileMode.Open, FileAccess.Read, FileShare.Read)) { using (ZipArchive zipArchive = new ZipArchive(fileStream, ZipArchiveMode.Read)) { foreach (ZipArchiveEntry entry in zipArchive.Entries) { if (StartsWith(entry.FullName, allowedEntries, StringComparison.Ordinal)) { string relPath = entry.FullName.Replace('/', Path.DirectorySeparatorChar); string destFileName = instanceDir + relPath; Directory.CreateDirectory(Path.GetDirectoryName(destFileName)); entry.ExtractToFile(destFileName, true); } } return(true); } } } catch (Exception ex) { log.WriteException(ex, Localization.UseRussian ? "Ошибка при распаковке конфигурации из архива" : "Error unpacking configuration from archive"); return(false); } }