Exemplo n.º 1
0
        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();
                    }
                }
            }
        }
Exemplo n.º 2
0
        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);
        }