Пример #1
0
        private static Task CompTree(DiscDirectoryInfo A, DiscDirectoryInfo B, DiscDirectoryInfo Out,
            CopyQueue WriteQueue, ComparisonStyle Style = ComparisonStyle.DateTimeOnly)
        {
            if (WriteQueue == null) throw new ArgumentNullException("WriteQueue");
            List<Task> tasks = new List<Task>();

            DiscFileSystem Alock = A.FileSystem;
            DiscFileSystem Block = B.FileSystem;
            DiscFileSystem Olock = Out.FileSystem;

            ParallelQuery<DiscFileInfo> BFiles;
            lock(Block)
                BFiles = B.GetFiles("*.*", SearchOption.AllDirectories).ToArray().AsParallel();
            BFiles = BFiles.Where(file =>
                                  !ExcludeFiles.Contains(file.FullName.ToUpperInvariant())
                                 ).AsParallel();
            BFiles = ExclusionRules.Aggregate(BFiles, (current, rule) => current.Where(file => !rule.IsMatch(file.FullName)));

                BFiles = BFiles.Where(file =>
                    {
                        DiscFileInfo Atmp;
                        lock (Alock)
                            Atmp = Alock.GetFileInfo(file.FullName);
                        return !CompareFile(Atmp, file, Style);
                    }).ToArray().AsParallel();

            foreach (var file in BFiles)
            {
                DiscFileInfo outFile;
                lock (Olock)
                    outFile = Out.FileSystem.GetFileInfo(Path.Combine(Out.FullName, file.FullName));
                lock (Alock)
                WriteQueue.Add(file, outFile, Alock.GetFileInfo(file.FullName));
            }

            return Task.Factory.StartNew(() => Task.WaitAll(tasks.ToArray()), TaskCreationOptions.AttachedToParent);
        }
Пример #2
0
 public void MoveQueueTo(CopyQueue other)
 {
     lock (this)
         while (_queue.Any())
         {
             var item = _queue.First();
             other.Add(item.Value.Source, item.Key, item.Value.Base);
             _queue.Remove(item.Key);
         }
 }
Пример #3
0
        private static void ApplyPartDiff(PartitionInfo Base, PartitionInfo Diff)
        {
            CopyQueue queue = new CopyQueue();

            var BFS = VHDBuilder.DetectFileSystem(Base);
            var DFS = VHDBuilder.DetectFileSystem(Diff);

            if (BFS is NtfsFileSystem)
            {
                ((NtfsFileSystem)BFS).NtfsOptions.HideHiddenFiles = false;
                ((NtfsFileSystem)BFS).NtfsOptions.HideSystemFiles = false;
            }
            if (DFS is NtfsFileSystem)
            {
                ((NtfsFileSystem)DFS).NtfsOptions.HideHiddenFiles = false;
                ((NtfsFileSystem)DFS).NtfsOptions.HideSystemFiles = false;
            }

            var DRoot = DFS.Root;

            var DFRoots = DRoot.GetDirectories(RootFiles);
            if (DFRoots.Any())
            {
                var DFileRoot = DFRoots.Single();

                foreach (var file in DFileRoot.GetFiles("*.*", SearchOption.AllDirectories))
                {
                    var BFile = BFS.GetFileInfo(file.FullName.Substring(RootFiles.Length + 1));
                    queue.Add(file, BFile); // TODO:  fix this for applying diffs!!!
                }
                queue.Go();
            }

            var DsysRegs = DRoot.GetDirectories(RootSystemRegistry);
            if (DsysRegs.Any())
            {
                var DsysReg = DsysRegs.Single();

                foreach (var file in DsysReg.GetFiles("*.*", SearchOption.AllDirectories))
                {
                    var BReg = BFS.GetFileInfo(file.FullName.Substring(RootSystemRegistry.Length + 1));
                    if (!BReg.Exists)
                        queue.Add(file, BReg);
                    else
                    {
                        var BHive = new RegistryHive(BReg.Open(FileMode.Open, FileAccess.ReadWrite));
                        RegDiff.ReadFromStream(file.OpenRead()).ApplyTo(BHive.Root);
                    }
                }
                queue.Go();
            }

            var DuserRegs = DRoot.GetDirectories(RootUserRegistry);
            if (DuserRegs.Any())
            {
                var DuserReg = DuserRegs.Single();
                var Bfiles =
                    BFS.GetFiles(String.Empty, "*.*", SearchOption.AllDirectories)
                       .Where(str => UserRegisrtyFiles.IsMatch(str))
                       .ToArray();
                foreach (var file in DuserReg.GetFiles("*.*", SearchOption.AllDirectories))
                {
                    var username = DiffUserRegistry.Match(file.FullName).Groups["user"].Value;
                    var userFile = Bfiles.Where(str => GetUserRegex(username).IsMatch(str)).ToArray();
                    if (!userFile.Any()) continue;
                    var BReg = BFS.GetFileInfo(userFile.Single());
                    if (!BReg.Exists) continue;
                    var BHive = new RegistryHive(BReg.Open(FileMode.Open, FileAccess.ReadWrite));
                    RegDiff.ReadFromStream(file.OpenRead()).ApplyTo(BHive.Root);
                }
            }
        }