|
|
@@ -0,0 +1,55 @@
|
|
|
+namespace RunnersMeet.Server;
|
|
|
+
|
|
|
+public class FileSize
|
|
|
+{
|
|
|
+ private const long MagnitudeStep = 1024;
|
|
|
+
|
|
|
+ private static readonly IDictionary<Magnitude, string> UnitMap = new Dictionary<Magnitude, string>
|
|
|
+ {
|
|
|
+ [Magnitude.Single] = "B",
|
|
|
+ [Magnitude.Kilo] = "KB",
|
|
|
+ [Magnitude.Mega] = "MB",
|
|
|
+ [Magnitude.Giga] = "GB",
|
|
|
+ [Magnitude.Tera] = "TB",
|
|
|
+ };
|
|
|
+
|
|
|
+ public static FileSize FromMagnitudeValue(long number, Magnitude magnitude)
|
|
|
+ {
|
|
|
+ return new FileSize(number * (1 << (10 * (int)magnitude)));
|
|
|
+ }
|
|
|
+
|
|
|
+ public static explicit operator FileSize(long value)
|
|
|
+ {
|
|
|
+ return new FileSize(value);
|
|
|
+ }
|
|
|
+
|
|
|
+ public long Bytes { get; }
|
|
|
+
|
|
|
+ public FileSize(long bytes)
|
|
|
+ {
|
|
|
+ Bytes = bytes;
|
|
|
+ }
|
|
|
+
|
|
|
+ public string ToHumanReadable()
|
|
|
+ {
|
|
|
+ double value = Bytes;
|
|
|
+ var magnitude = Magnitude.Single;
|
|
|
+
|
|
|
+ while (value > MagnitudeStep && (int)magnitude < (int)Magnitude.Tera)
|
|
|
+ {
|
|
|
+ value /= MagnitudeStep;
|
|
|
+ magnitude = (Magnitude)((int)magnitude + 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ return $"{value:0.00} {UnitMap[magnitude]}";
|
|
|
+ }
|
|
|
+
|
|
|
+ public enum Magnitude
|
|
|
+ {
|
|
|
+ Single = 0,
|
|
|
+ Kilo = 1,
|
|
|
+ Mega = 2,
|
|
|
+ Giga = 3,
|
|
|
+ Tera = 4
|
|
|
+ }
|
|
|
+}
|