Files
linqpad/StrataJazz FileSize Report.linq

128 lines
5.4 KiB
C#

<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
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<string, Dictionary<string, long>>();
var fileExtensions = new List<string>();
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<string, long>());
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))),
};
}