コード例 #1
0
ファイル: Configuration.cs プロジェクト: lzl1918/FileDesktop
        public ItemsResult EnumerateItems()
        {
            WatchingTree         watchingTree = new WatchingTree();
            List <DirectoryInfo> directories  = new List <DirectoryInfo>();
            List <FileInfo>      files        = new List <FileInfo>();

            EnumerateIncludeItems(directories, files, watchingTree);
            EnumerateScanDirectories(directories, files, watchingTree);
            return(new ItemsResult(files, directories, watchingTree));
        }
コード例 #2
0
        public static WatcherManager CreateFromTree(WatchingTree tree)
        {
            if (tree == null)
            {
                throw new ArgumentNullException(nameof(tree));
            }
            List <WatchingTreeItem> watchPoints = RetriveWatchPoints(tree);
            List <Watcher>          watchers    = new List <Watcher>();
            string path;

            foreach (WatchingTreeItem watchPoint in watchPoints)
            {
                path = tree.PathOfItem(watchPoint);
                WatcherCreationOptions creationOptions = CollectNodes(watchPoint, path);
                watchers.Add(new Watcher(path, creationOptions));
            }
            return(new WatcherManager(watchers, tree));
        }
コード例 #3
0
        internal ItemsResult(IReadOnlyList <FileInfo> files, IReadOnlyList <DirectoryInfo> directories, WatchingTree watchingTree)
        {
            if (files == null)
            {
                throw new ArgumentNullException(nameof(files));
            }
            if (directories == null)
            {
                throw new ArgumentNullException(nameof(directories));
            }
            if (watchingTree == null)
            {
                throw new ArgumentNullException(nameof(watchingTree));
            }

            Files        = files;
            Directories  = directories;
            WatchingTree = watchingTree;
        }
コード例 #4
0
        private static List <WatchingTreeItem> RetriveWatchPoints(WatchingTree tree)
        {
            List <WatchingTreeItem>  result   = new List <WatchingTreeItem>();
            Queue <WatchingTreeItem> itemsQue = new Queue <WatchingTreeItem>();
            WatchingTreeItem         root     = tree.Root;

            foreach (var pair in root.Children)
            {
                itemsQue.Enqueue(pair.Value);
            }

            WatchingTreeItem item;
            WatchingTreeItem child;
            bool             childItems;

            while (itemsQue.Count > 0)
            {
                item       = itemsQue.Dequeue();
                childItems = item.Children.Any(pair =>
                {
                    ItemWatchingOptions data = pair.Value.Data;
                    return(data != null && data.WatchingStatus != ItemWatchingStatus.None);
                });
                if (childItems)
                {
                    result.Add(item);
                    continue;
                }
                foreach (var pair in item.Children)
                {
                    child = pair.Value;
                    itemsQue.Enqueue(child);
                }
            }
            return(result);
        }
コード例 #5
0
ファイル: Configuration.cs プロジェクト: lzl1918/FileDesktop
        private void EnumerateScanDirectory(DirectoryScanOptions scanOptions, List <DirectoryInfo> directories, List <FileInfo> files, WatchingTree watchingTree)
        {
            WatchingTreeItem item = watchingTree.ItemByPath(scanOptions.DirectoryPath, ItemType.Directory);

            item.Data = new ItemWatchingOptions()
            {
                ScanOptions    = scanOptions,
                WatchingStatus = ItemWatchingStatus.ScanNeeded
            };

            if (!Directory.Exists(scanOptions.DirectoryPath))
            {
                return;
            }
            Queue <DirectoryInfo> dirque = new Queue <DirectoryInfo>();
            DirectoryInfo         dir    = new DirectoryInfo(scanOptions.DirectoryPath);

            dirque.Enqueue(dir);
            dirque.Enqueue(null);
            int               currentDepth = 1;
            int               maxdepth     = scanOptions.ScanDepth;
            DirectoryInfo     current;
            ScanFilterOptions excludeFilters = scanOptions.Excludes;
            ScanFilterOptions includeFilters = scanOptions.Includes;

            while (true)
            {
                current = dirque.Dequeue();
                if (current == null)
                {
                    if (dirque.Count <= 0)
                    {
                        break;
                    }

                    currentDepth++;
                    if (currentDepth > maxdepth)
                    {
                        foreach (DirectoryInfo directory in dirque)
                        {
                            if (!excludeFilters.IsMatch(directory) &&
                                includeFilters.IsMatch(directory))
                            {
                                directories.Add(directory);
                            }
                        }
                        break;
                    }
                    else
                    {
                        dirque.Enqueue(null);
                        continue;
                    }
                }

                IEnumerable <DirectoryInfo> enumeratedDirectories = current.EnumerateDirectories();
                if (!includeFilters.IsDefault)
                {
                    foreach (DirectoryInfo directory in enumeratedDirectories)
                    {
                        if (includeFilters.IsMatch(directory))
                        {
                            directories.Add(directory);
                        }
                        else if (!excludeFilters.IsMatch(directory))
                        {
                            dirque.Enqueue(directory);
                        }
                    }
                }
                else
                {
                    foreach (DirectoryInfo directory in enumeratedDirectories)
                    {
                        if (!excludeFilters.IsMatch(directory))
                        {
                            dirque.Enqueue(directory);
                        }
                    }
                }


                IEnumerable <FileInfo> enumeratedFiles = current.EnumerateFiles();
                if (!includeFilters.IsDefault)
                {
                    foreach (FileInfo file in enumeratedFiles)
                    {
                        if (includeFilters.IsMatch(file))
                        {
                            files.Add(file);
                        }
                    }
                }
                else
                {
                    foreach (FileInfo file in enumeratedFiles)
                    {
                        if (!excludeFilters.IsMatch(file) && includeFilters.IsMatch(file))
                        {
                            files.Add(file);
                        }
                    }
                }
            }
        }
コード例 #6
0
ファイル: Configuration.cs プロジェクト: lzl1918/FileDesktop
 private void EnumerateIncludeItems(List <DirectoryInfo> directories, List <FileInfo> files, WatchingTree watchingTree)
 {
     foreach (string path in IncludeItems.Files)
     {
         WatchingTreeItem item = watchingTree.ItemByPath(path, ItemType.File);
         item.Data = new ItemWatchingOptions();
         if (File.Exists(path))
         {
             files.Add(new FileInfo(path));
             item.Data.WatchingStatus = ItemWatchingStatus.Watched;
         }
         else
         {
             item.Data.WatchingStatus = ItemWatchingStatus.Expected;
         }
     }
     foreach (string path in IncludeItems.Directories)
     {
         WatchingTreeItem item = watchingTree.ItemByPath(path, ItemType.Directory);
         item.Data = new ItemWatchingOptions();
         if (Directory.Exists(path))
         {
             directories.Add(new DirectoryInfo(path));
             item.Data.WatchingStatus = ItemWatchingStatus.Watched;
         }
         else
         {
             item.Data.WatchingStatus = ItemWatchingStatus.Expected;
         }
     }
 }
コード例 #7
0
ファイル: Configuration.cs プロジェクト: lzl1918/FileDesktop
 private void EnumerateScanDirectories(List <DirectoryInfo> directories, List <FileInfo> files, WatchingTree watchingTree)
 {
     foreach (DirectoryScanOptions scanOptions in ScanDirectories)
     {
         EnumerateScanDirectory(scanOptions, directories, files, watchingTree);
     }
 }
コード例 #8
0
 private WatcherManager(List <Watcher> watchers, WatchingTree tree)
 {
     this.watchers = watchers;
     this.tree     = tree;
 }