<ProgramFilesX64>\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll Amazon.Lambda.S3Events AWSSDK.Core AWSSDK.S3 Amazon Amazon.Auth.AccessControlPolicy Amazon.Auth.AccessControlPolicy.ActionIdentifiers Amazon.Internal Amazon.Lambda.S3Events Amazon.MissingTypes Amazon.Runtime Amazon.Runtime.CredentialManagement Amazon.Runtime.CredentialManagement.Internal Amazon.Runtime.EventStreams Amazon.Runtime.EventStreams.Internal Amazon.Runtime.Internal Amazon.Runtime.Internal.Auth Amazon.Runtime.Internal.Settings Amazon.Runtime.Internal.Transform Amazon.Runtime.Internal.Util Amazon.Runtime.SharedInterfaces Amazon.Runtime.SharedInterfaces.Internal Amazon.S3 Amazon.S3.Encryption Amazon.S3.Encryption.Internal Amazon.S3.Internal Amazon.S3.IO Amazon.S3.Model Amazon.S3.Model.Internal.MarshallTransformations Amazon.S3.Transfer Amazon.S3.Util Amazon.Util Amazon.Util.Internal Amazon.Util.Internal.PlatformServices Newtonsoft.Json Newtonsoft.Json.Converters Newtonsoft.Json.Linq Newtonsoft.Json.Schema Newtonsoft.Json.Serialization System System.Diagnostics System.Diagnostics.Tracing System.IO.Compression ThirdParty.BouncyCastle.Asn1 ThirdParty.BouncyCastle.Asn1.Utilities ThirdParty.BouncyCastle.Math ThirdParty.BouncyCastle.OpenSsl ThirdParty.BouncyCastle.Utilities.IO.Pem ThirdParty.Ionic.Zlib ThirdParty.Json.LitJson ThirdParty.MD5 void Main() { var baseDir = @"D:\Git\Jazz"; var solution = Path.Combine(baseDir, "veracode.sln"); var regex = new Regex(@"[^=]*=\s+""([^""]*)"",\s""([^""]*)"".*"); var veracodeProjectFolders = File.ReadAllLines(solution) .Where(l => l.StartsWith("Project(")) .Where(l => regex.Match(l).Success) .ToList(); var fileTypes = new Regex(@"^\.vb$|^\.css?$|^\.jsx?$|^\.html$|^\.as[achmp]{1}x$|^\.xs[xd]{1}$"); //veracodeProjectFolders.Dump(); var vpnames = veracodeProjectFolders .Where(l => !string.IsNullOrEmpty(regex.Replace(l, "$1"))) .ToDictionary(l => regex.Replace(l, "$1"), l => Path.GetDirectoryName(Path.Combine(baseDir, regex.Replace(l, "$2")))); var vpf = vpnames.Values.ToList(); //vpnames.Dump(); //vpf.ConvertAll(v => Path.GetDirectoryName(Path.Combine(baseDir, v))).Dump(); baseDir = Path.Combine(baseDir, @"Code\"); var dirs = Directory.EnumerateDirectories(baseDir) .Where(d => vpf.Contains(d)) .ToList() .ConvertAll(d => d.Replace(baseDir, "")); var fileSizes = new Dictionary>(); var fileExtensions = new List(); foreach (var dir in dirs) { var path = Path.Combine(baseDir, dir); //$"{baseDir} + {dir} = {path}".Dump(); foreach (var file in Directory.GetFiles(path, "*.*", SearchOption.AllDirectories)) { if (file.Contains(@"\obj\") || file.Contains(@"\bin\")) continue; var fi = new FileInfo(file); fileExtensions.Add(fi.Extension); if (!fileTypes.IsMatch(fi.Extension)) continue; var fDir = fi.DirectoryName.Replace(baseDir, "").Split(Path.DirectorySeparatorChar)[0]; var fSize = fi.Length; if (!fileSizes.ContainsKey(dir)) fileSizes.Add(dir, new Dictionary()); if (!fileSizes[dir].ContainsKey(fi.Extension)) fileSizes[dir].Add(fi.Extension, 0); fileSizes[dir][fi.Extension] += fSize; } } var report = fileSizes.Keys.ToList() .ConvertAll(key => fileSizes[key].Keys.ToList() .ConvertAll(ext => new DirectorySize { Directory = key, FileExtension = ext, fileSize = fileSizes[key][ext] })) .SelectMany(x => x.Select(y => y)); report.Sum(x => x.fileSize).BytesToString().Dump("Total Source"); report.OrderBy(r => r.Directory).ThenBy(r => r.FileExtension).Dump(); fileExtensions.Distinct().OrderBy(e => e).Dump(); } // Define other methods and classes here public class DirectorySize { public string Directory { get; set; } public string FileExtension { get; set; } public long fileSize { get; set; } object ToDump() => new { Directory, FileExtension, FileSize = new XElement("LINQPad.HTML", new XElement("div", new XAttribute("align", "right"), new XAttribute("style", $"background-color:{((fileSize > Math.Pow(1024, 3)) ? "red" : (fileSize > Math.Pow(1024, 2)) ? "violet" : "white")};"), $"{fileSize.BytesToString()}".PadLeft(10))), }; }