internal void GarbageCollect(DateTime timestamp) { DirectoryInfo garbageDir = new DirectoryInfo(Path.Combine(_Dir.FullName, GARBAGE_SUBDIR)); if (!garbageDir.Exists) { garbageDir.Create(); } var allInventoryHashes = from i in Inventory.GetInventoriesNewestFirst(_Dir, _Configuration) from f in i.Folder.AllFiles select f.Sha256; HashSet <string> invHashes = new HashSet <string>(allInventoryHashes); var shasStorage = (from x in _Manifest.ManifestObjects select new { Sha = x.Sha256source, Partition = x.Partition }) .ToArray(); var garbage = shasStorage.Where(x => !invHashes.Contains(x.Sha)).ToList(); Program.log.InfoFormat("{0} files are garbage", garbage.Count); foreach (var g in garbage) { Program.log.Info(" " + g.Sha + " p" + g.Partition); FileInfo fi = new FileInfo(GetStorageTarget(g.Sha, _PartitionManager.GetDirByNumber(g.Partition))); if (!fi.Exists) { throw new Exception(); } string target = Path.Combine(garbageDir.FullName, fi.Name); File.Move(fi.FullName, target); _Manifest.Garbage(g.Sha, timestamp); } Program.log.Info("deleting empty directories"); foreach (DirectoryInfo dir in _PartitionManager.AllDirectories) { DirectoryInfo[] di = dir.GetDirectories("*", SearchOption.AllDirectories); foreach (var d in di) { bool empty = !d.EnumerateFiles().Any() && !d.EnumerateDirectories().Any(); if (empty) { Program.log.Info(" " + d.FullName); d.Delete(); } } } }
private static IList <FileJob> GetRestoreJobs(IEnumerable <IFile> files, Manifest manifest, PartitionManager partitionManager, DirectoryInfo diTarget, string password, string salt) { IList <IFile> fs = files.ToList(); Program.log.Info("restore files total: " + fs.Count()); IList <FileJob> copyJobs = fs.Select(x => FileJob.GetRestoreJob(x, partitionManager.GetDirByNumber(manifest.GetPartition(x.Sha256)), diTarget, password, salt)).ToList(); IList <FileJob> notExistingTargets = copyJobs.Where(x => !File.Exists(x.ToPath)).ToList(); Program.log.Info("not existing: " + notExistingTargets.Count()); return(notExistingTargets); }