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);
        }
Ejemplo n.º 2
0
 /// <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);
 }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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));
                }
            }
        }