示例#1
0
        /// <summary>
        /// Main method to count given path
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        public static DirectoryCache GetDirectorySizeCache(string path)
        {
            var directoryCache = LoadDirectory(path);
            var missingList    = UnauthorizedAccessCache.GetInstance().GetAllMissingPath();

            Task[] taskList = missingList
                              .Select(directoryPath => new Task(() => {
                DiskUsageTask(directoryPath, directoryCache);
            })).ToArray();
            taskList.AsParallel().ForAll(task => task.Start());
            Task.WaitAll(taskList);

            return(directoryCache);
        }
示例#2
0
        /// <summary>
        /// recursive load directory info
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        internal static DirectoryCache LoadDirectory(string path)
        {
            var           directoryCache = new DirectoryCache();
            DirectoryInfo directory      = new DirectoryInfo(path);

            directoryCache.LastSeen = DateTime.Now;
            directoryCache.Uri      = directory.FullName;

            if (!CheckAccess(directory))
            {
                directoryCache.Accessible = false;
                UnauthorizedAccessCache.GetInstance().InsertMissPath(directory.Parent?.FullName ?? "", path);
                return(directoryCache);
            }

            var fileList = directory.GetFiles()
                           .Where(item =>
                                  !FileExcludeConfig.GetInstance().TestFileMatch(item.FullName))
                           .ToList();

            var directoryList = directory.GetDirectories()
                                .Where(item =>
                                       !FileExcludeConfig.GetInstance().TestDirectionMatch(item.FullName))
                                .ToList();

            Parallel.ForEach(fileList,
                             fileInfo => {
                lock (directoryCache.FileCaches) {
                    directoryCache.FileCaches.Add(new FileCache(fileInfo.FullName, (ulong)fileInfo.Length,
                                                                DateTime.Now));
                }
            });

            Parallel.ForEach(directoryList,
                             directoryInfo => {
                var dir = LoadDirectory(directoryInfo.FullName);
                lock (directoryCache.SubDirectoryCaches) {
                    directoryCache.SubDirectoryCaches.Add(dir);
                }
            });

            return(directoryCache);
        }