public RootDirectoryEntity Deserialize(string path) { RootDirectoryEntity root = base.Deserialize <RootDirectoryEntity>(path); root.RelativePath = ""; root.BuildPaths(); return(root); }
public void UpdateGameDirectory(RootDirectoryEntity updated, string outputDir, IProgress <int> progress) { ManagedGameVersion oldMGV = _mvs.GetManagedVersions().First(mvg => mvg.Version == updated.Version); RootDirectoryEntity oldBuild = new RootDirectoryEntityIO().Deserialize(oldMGV.GameXML); HashSet <FileEntity> oldFiles = oldBuild.GetAllFileEntities(true).OfType <FileEntity>().ToHashSet(); HashSet <FileEntity> newFiles = updated.GetAllFileEntities(true).OfType <FileEntity>().ToHashSet(); HashSet <FileEntity> changedFiles = newFiles.Except(oldFiles).ToHashSet(); HashSet <FileEntity> filesToRemove = oldFiles.Except(newFiles).ToHashSet(); // Do not remove files that only changed location HashSet <string> newFilesHashes = newFiles.Select(x => x.Hash).ToHashSet(); HashSet <FileEntity> movedFileHashes = filesToRemove.Where(f => newFilesHashes.Contains(f.Hash)).ToHashSet(); filesToRemove.ExceptWith(movedFileHashes); string container = Settings.Default.ContainerDirectory; List <RootDirectoryEntity> otherVersions = new List <RootDirectoryEntity>(); foreach (var mgv in _mvs.GetManagedVersions().Except(new List <ManagedGameVersion>() { oldMGV })) { RootDirectoryEntity data = new RootDirectoryEntityIO().Deserialize(mgv.GameXML); otherVersions.Add(data); } int basePercent = 0; Progress <int> partialProgress = new Progress <int>(percent => { progress.Report(basePercent + percent / 2); }); // Remove old unused files from cache GameFilesRemover.RemoveFiles(filesToRemove, otherVersions, Helpers.EntityToPath(container), _dirCache, partialProgress ); SaveDirCache(); basePercent = 50; // Remove old unused files from game directory foreach (FileEntity unusedFile in filesToRemove) { string path = Path.Combine(oldMGV.Path, unusedFile.RelativePath); try { File.Delete(path); } catch (Exception ex) { } } // Update files in directory CreateGameDirectory(updated, oldMGV.Path, partialProgress); progress.Report(100); }
public static RootDirectoryEntity CreateRootEntityFromDirectory(string path, bool withHash = true, IProgress <int> progress = null) { DirectoryInfo wot = new DirectoryInfo(path); RootDirectoryEntity root = new RootDirectoryEntity(GetGameVersion(path)); HashProvider hp = withHash ? new SHA1HashProvider() : null; GameDirectoryParser.Parse(wot, root, wot.FullName.Length, hp, IgnoreList.FromEnumerable(File.ReadAllLines("ignored.txt")), progress); return(root); }
/// <summary> /// Deletes target version's files from container if they're not used by other versions. /// </summary> /// <param name="versionToRemove"></param> /// <param name="allVersions"></param> /// <param name="fileToPath"></param> /// <param name="cache"></param> /// <param name="progress"></param> public static void RemoveFiles(RootDirectoryEntity versionToRemove, List <RootDirectoryEntity> allVersions, Func <BaseEntity, string> fileToPath, DirectoryCache cache, IProgress <int> progress) { RemoveFiles(new HashSet <FileEntity>(versionToRemove.GetAllFileEntities(true).OfType <FileEntity>()), allVersions.Except(new List <RootDirectoryEntity> { versionToRemove }).ToList(), fileToPath, cache, progress); }
public void ExtractToContainer(RootDirectoryEntity root, string gameDir, IProgress <int> progress) { string container = Settings.Default.ContainerDirectory; ExtractionManager ex = new ExtractionManager(new List <Extractor>() { new PackageExtractor(), new FileExtractor() }); ex.Extract(root, gameDir, Helpers.EntityToPath(container), _dirCache, progress); string cacheXml = Settings.Default.DirectoryCacheFile; _ds.Serialize(_dirCache, cacheXml); }
private async void btnShowInfo_Click(object sender, RoutedEventArgs e) { btnShowInfo.IsEnabled = false; string gameDir = txtFolder.Text; DirectoryInfo gameDirInfo = new DirectoryInfo(gameDir); string version = Helpers.GetGameVersion(gameDir); RootDirectoryEntity root = new RootDirectoryEntity(version); await Task.Run(() => GameDirectoryParser.Parse(gameDirInfo, root, gameDirInfo.FullName.Length, null, new IgnoreList(), null)); long files = Helpers.TotalFiles(root); long size = Helpers.TotalSize(root) / (1024 * 1024); string result = string.Format("Directory: {0}\nVersion: {1}\nTotal files: {2:N0}\nTotal size: {3:N0} MB", gameDir, version, files, size); MessageBox.Show(result); btnShowInfo.IsEnabled = true; }
private async void btnCreateFile_Click(object sender, RoutedEventArgs e) { DirectoryInfo wot = new DirectoryInfo(txtGameFolder.Text); string output = txtOutputFile.Text; RootDirectoryEntity root = new RootDirectoryEntity(Helpers.GetGameVersion(txtGameFolder.Text)); HashProvider sha1 = new SHA1HashProvider(); btnCreateFile.IsEnabled = false; btnCreateFile.Content = "Creating..."; await Task.Run(() => GameDirectoryParser.Parse(wot, root, wot.FullName.Length, sha1, IgnoreList.FromEnumerable(File.ReadAllLines("ignored.txt")), null)); await Task.Run(() => new RootDirectoryEntityIO().Serialize(root, output)); btnCreateFile.Content = "Create"; btnCreateFile.IsEnabled = true; }
public static void Parse(DirectoryInfo directory, RootDirectoryEntity root, int prefixLength, HashProvider hashProvider, IgnoreList ignoreList, IProgress <int> progress) { RootDirectoryEntity temp = new RootDirectoryEntity(); ParseInner(directory, temp, prefixLength, null, ignoreList, null); if (hashProvider == null) { progress?.Report(100); return; } int totalFiles = temp.GetAllFileEntities(true).Count; int processed = 0; Progress <int> sumProgress = new Progress <int>(prog => { int percent = ++processed * 100 / totalFiles; progress?.Report(percent); }); ParseInner(directory, root, prefixLength, hashProvider, ignoreList, sumProgress); }
public static void RemoveFiles(RootDirectoryEntity versionToRemove, List <RootDirectoryEntity> versions, string container, Func <BaseEntity, string> fileToPath, DirectoryCache cache, IProgress <int> progress) { HashSet <FileEntity> versionFiles = new HashSet <FileEntity>(versionToRemove.GetAllFileEntities(true).OfType <FileEntity>()); List <RootDirectoryEntity> otherVersions = versions.ToList(); otherVersions.Remove(versionToRemove); HashSet <FileEntity> otherFiles = new HashSet <FileEntity>(); otherVersions.ForEach(version => otherFiles.UnionWith(version.GetAllFileEntities(true).OfType <FileEntity>())); versionFiles.ExceptWith(otherFiles); int total = versionFiles.Count; float done = 0; foreach (FileEntity fe in versionFiles) { string path = fileToPath(fe); if (cache.DeleteDirectoryFromCache(path)) { try { Directory.Delete(path, true); } catch (Exception ex) { } progress?.Report((int)(100 * ++done / total)); } } }
public void CreateGameDirectory(RootDirectoryEntity game, string outputDir, IProgress <int> progress) { string container = Settings.Default.ContainerDirectory; GameDirGenerator.Generate(game, outputDir, container, Helpers.EntityToPath(container), progress); }
private void CreateVersionXML(string dir, string output, IProgress <int> progress) { RootDirectoryEntity root = Helpers.CreateRootEntityFromDirectory(dir, true, progress); new RootDirectoryEntityIO().Serialize(root, output); }
public void Import(string path, bool copyMods, IProgress <int> progress) { ImportStatus status = CanImport(path); if (status == ImportStatus.INVALID_PATH) { return; } if (status == ImportStatus.ALREADY_EXISTS) { // Check if user attempted to import from managed directory bool isTargetDirectoryManaged = _mvs.GetManagedVersions().Select(v => Path.GetFullPath(v.Path)).Contains(Path.GetFullPath(path)); if (isTargetDirectoryManaged) { return; } } int basePercent = 0; Progress <int> partialProgress = new Progress <int>(percent => { progress.Report(basePercent + percent / 3); }); string gameVersion = Helpers.GetGameVersion(path); string xmlFilename = gameVersion.Replace(".", "_") + ".xml"; string xml = Path.Combine(Settings.Default.VersionDataDirectory, xmlFilename); string output = Path.Combine(Settings.Default.GameOutputDirectory, "World of Tanks " + gameVersion); if (status == ImportStatus.CAN_IMPORT) { // Import new version CreateVersionXML(path, xml, partialProgress); basePercent = 33; _gds.ExtractToContainer(xml, path, partialProgress); basePercent = 66; _gds.CreateGameDirectory(xml, output, partialProgress); } else if (status == ImportStatus.ALREADY_EXISTS) { // Update version RootDirectoryEntity newBuild = Helpers.CreateRootEntityFromDirectory(path, true, partialProgress); basePercent = 33; _gds.ExtractToContainer(newBuild, path, partialProgress); basePercent = 66; _gds.UpdateGameDirectory(newBuild, output, partialProgress); new RootDirectoryEntityIO().Serialize(newBuild, xml); } if (copyMods) { CopyDirectory("mods", path, output); CopyDirectory("res_mods", path, output); } progress.Report(100); if (status == ImportStatus.CAN_IMPORT) { System.Windows.Application.Current.Dispatcher.BeginInvoke((Action) delegate() { _mvs.Add(xml, output); }); } }