private FolderSizeInfo GenerateFolderInfo(string path, bool includeSubDirs, IEnumerable <FileInfo> additionalFiles = null) { var folderSizeInfo = new FolderSizeInfo(); var dir = new DirectoryInfo(path); var files = dir.EnumerateFiles("*.*", new EnumerationOptions { IgnoreInaccessible = true, RecurseSubdirectories = includeSubDirs }).ToList(); if (additionalFiles != null) { files.AddRange(additionalFiles); } var size = ByteSize.FromBytes(files.Sum(x => x.Length)); folderSizeInfo.FolderName = dir.Name; folderSizeInfo.PathToFolder = dir.FullName; folderSizeInfo.FileCount = files.Count(); folderSizeInfo.FolderSizeInBytes = size.Bytes; folderSizeInfo.FolderSizeInMb = size.KiloBytes; folderSizeInfo.FolderSizeInMb = size.MegaBytes; folderSizeInfo.FolderSizeInGb = size.GigaBytes; folderSizeInfo.FormatedSize = $"{size.LargestWholeNumberDecimalValue} {size.LargestWholeNumberDecimalSymbol}"; folderSizeInfo.Files = GenerateFileSizeInfo(files); return(folderSizeInfo); }
private static FolderSizeInfo GetDirectorySize(DirectoryInfo d, List<FolderSizeInfo> data, int levels) { var currentDirectory = new FolderSizeInfo(); if (levels >= 0) data.Add(currentDirectory); long Size = 0; // Add file sizes. FileInfo[] fis = d.GetFiles(); foreach (FileInfo fi in fis) { Size += fi.Length; } currentDirectory.Size = Size; currentDirectory.Path = d; // Add subdirectory sizes. DirectoryInfo[] dis = d.GetDirectories(); currentDirectory.DirectoryCount = dis.Length; currentDirectory.DirectoryCountWithChildren = dis.Length; foreach (DirectoryInfo di in dis) { var dd = GetDirectorySize(di, data, levels - 1); Size += dd.SizeWithChildren; currentDirectory.DirectoryCountWithChildren += dd.DirectoryCountWithChildren; } currentDirectory.SizeWithChildren = Size; return currentDirectory; }
/// <summary> /// Serializes the object to JSON. /// </summary> /// <param name="writer">The <see cref="T: Newtonsoft.Json.JsonWriter" /> to write to.</param> /// <param name="obj">The object to serialize to JSON.</param> internal static void Serialize(JsonWriter writer, FolderSizeInfo obj) { // Required properties are always serialized, optional properties are serialized when not null. writer.WriteStartObject(); if (obj.StoreRelativePath != null) { writer.WriteProperty(obj.StoreRelativePath, "StoreRelativePath", JsonWriterExtensions.WriteStringValue); } if (obj.FolderSize != null) { writer.WriteProperty(obj.FolderSize, "FolderSize", JsonWriterExtensions.WriteStringValue); } writer.WriteEndObject(); }
/// <summary> /// Calculate disk space usage under <paramref name="root"/>. If <paramref name="levels"/> is provided, /// then return subdirectory disk usages as well, up to <paramref name="levels"/> levels deep. /// If levels is not provided or is 0, return a list with a single element representing the /// directory specified by <paramref name="root"/>. /// </summary> /// <returns></returns> public static FolderSizeInfo GetDirectorySize(DirectoryInfo root, int levels = 0) { var currentDirectory = new FolderSizeInfo(); // Add file sizes. FileInfo[] fis = root.GetFiles(); currentDirectory.Size = 0; foreach (FileInfo fi in fis) { currentDirectory.Size += fi.Length; } // Add subdirectory sizes. DirectoryInfo[] dis = root.GetDirectories(); currentDirectory.Path = root; currentDirectory.SizeWithChildren = currentDirectory.Size; currentDirectory.DirectoryCount = dis.Length; currentDirectory.DirectoryCountWithChildren = dis.Length; currentDirectory.FileCount = fis.Length; currentDirectory.FileCountWithChildren = fis.Length; if (levels >= 0) { currentDirectory.Children = new List <FolderSizeInfo>(); } foreach (DirectoryInfo di in dis) { var dd = GetDirectorySize(di, levels - 1); if (levels >= 0) { currentDirectory.Children.Add(dd); } currentDirectory.SizeWithChildren += dd.SizeWithChildren; currentDirectory.DirectoryCountWithChildren += dd.DirectoryCountWithChildren; currentDirectory.FileCountWithChildren += dd.FileCountWithChildren; } return(currentDirectory); }
public async IAsyncEnumerable <FolderSizeInfo> CalculateFolderSizesAsyncStream(string rootDirPath, bool includeSubDirs) { bool shouldCalculate = true; try { if (!Directory.Exists(rootDirPath)) { shouldCalculate = false; } } catch (Exception ex) { var exception = new FileServiceException( "Failure in file service", new CalculateFolderSizesAsyncStreamException( "Size calculation for given root path failed", ex)); throw exception; } if (shouldCalculate) { await Task.Delay(0); var options = new EnumerationOptions { IgnoreInaccessible = true, RecurseSubdirectories = includeSubDirs }; string[] allFolders; try { allFolders = Directory.GetDirectories(rootDirPath, "*", options); } catch (Exception ex) { var exception = new FileServiceException( "Failure in file service", new CalculateFolderSizesAsyncStreamException( "Size calculation for given root path failed", ex)); throw exception; } foreach (var folder in allFolders) { FolderSizeInfo generated = null; try { generated = GenerateFolderInfo(folder, true); } catch (Exception ex) { var exception = new FileServiceException( "Failure in file service", new CalculateFolderSizesAsyncStreamException( "Size calculation for given root path failed", ex)); throw exception; } yield return(generated); } FolderSizeInfo root = null; try { root = GenerateFolderInfo(rootDirPath, false); } catch (Exception ex) { var exception = new FileServiceException( "Failure in file service", new CalculateFolderSizesAsyncStreamException( "Size calculation for given root path failed", ex)); throw exception; } yield return(root); } }