示例#1
0
        public void Create(string MountPoint, long LastUSN)
        {
            MonitoredMountpoint mountPoint = new MonitoredMountpoint()
            {
                MountPoint = MountPoint, CurrentUSNLocation = LastUSN, Server = Singleton.Instance.CurrentServer
            };

            using (Repository repo = new Repository())
            {
                repo.Add(mountPoint);
            }

            Console.WriteLine("Success");
        }
示例#2
0
        public static List <FileAction> PerformRollup(List <RawUSNEntry> rawEntries, MonitoredMountpoint syncFrom, Repository repository)
        {
            //logger.Info("{0} rawEntries", rawEntries.Count);
            var entries = rawEntries.Where(f => f.Close.HasValue && f.Close.Value && (!f.RenameOldName.HasValue || !f.RenameOldName.Value));

            //logger.Info("{0} entries", entries.Count());
            if (syncFrom.IgnoreList != null && syncFrom.IgnoreList.Any())
            {
                entries = syncFrom.IgnoreList.Select(ignore => new Regex(ignore)).Aggregate(entries, (current, regex) => current.Where(f => !regex.IsMatch(f.RelativePath)));
            }
            //logger.Info("{0} entries2", entries.Count());
            entries = entries.OrderBy(f => f.Path).ThenBy(f => f.FileCreate);

            var toReturn = new List <FileAction>();

            foreach (var entry in entries)
            {
                try
                {
                    if (entry.RenameNewName.HasValue)
                    {
                        var item = new RenameAction();
                        item.IsDirectory = entry.Directory.HasValue && entry.Directory.Value;
                        item.RenameFrom  = entry.RenameFromRelativePath;
                        if (string.IsNullOrWhiteSpace(item.RenameFrom))
                        {
                            logger.Warn("Unable to find RenameFrom for USN item " + item.USN);
                            continue;
                        }

                        item.RelativePath = entry.RelativePath;
                        item.USNEntry     = entry;
                        item.USN          = entry.USN;
                        item.RawPath      = entry.Path;
                        item.Mountpoint   = syncFrom;

                        toReturn.Add(item);
                    }
                    else if (entry.FileDelete.HasValue)
                    {
                        toReturn.Add(new DeleteAction()
                        {
                            RelativePath = entry.RelativePath,
                            USN          = entry.USN,
                            USNEntry     = entry,
                            RawPath      = entry.Path,
                            IsDirectory  = entry.Directory.HasValue && entry.Directory.Value,
                            Mountpoint   = syncFrom
                        });
                    }
                    else
                    {
                        toReturn.Add(new UpdateAction()
                        {
                            IsDirectory  = entry.Directory.HasValue && entry.Directory.Value,
                            RawPath      = entry.Path,
                            RelativePath = entry.RelativePath,
                            USN          = entry.USN,
                            USNEntry     = entry,
                            Mountpoint   = syncFrom
                        });
                    }
                }
                catch (Exception e)
                {
                    logger.Error("Error processing item " + entry.Id, e);
                    continue;
                }
            }

            var deletedFiles = toReturn.OfType <DeleteAction>().ToList();

            foreach (var deletedFile in deletedFiles)
            {
                if (toReturn.OfType <UpdateAction>().Select(f => f.RelativePath).Contains(deletedFile.RelativePath))
                {
                    toReturn.Remove(deletedFile);
                }

                toReturn.RemoveAll(f => f.RelativePath == deletedFile.RelativePath && f.USN < deletedFile.USN);
            }

            var fileActions = toReturn.Select(e => e.RelativePath).Distinct().Select(f => toReturn.FirstOrDefault(a => a.RelativePath == f)).ToList();

            foreach (var source in fileActions.OfType <RenameAction>().ToList())
            {
                if (fileActions.Any(f => f.RawPath == source.RenameFrom))
                {
                    fileActions.RemoveAll(f => f.RawPath == source.RenameFrom);
                    fileActions.Remove(source);
                    fileActions.Add(new RenameAction()
                    {
                        RelativePath = source.RelativePath,
                        RawPath      = source.RawPath,
                        USN          = source.USN,
                        IsDirectory  = source.IsDirectory,
                        Mountpoint   = syncFrom,
                        RenameFrom   = source.RenameFrom
                    });
                }
            }

            return(fileActions);
        }