/// <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); }
/// <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); }