51 lines
1.6 KiB
C#
51 lines
1.6 KiB
C#
using System.Globalization;
|
|
|
|
namespace SyncDirectory.Storage;
|
|
|
|
public class FileSize
|
|
{
|
|
public long Bytes { get; }
|
|
public double KiloBytes => Bytes / 1024.0;
|
|
public double MegaBytes => KiloBytes / 1024.0;
|
|
public double GigaBytes => MegaBytes / 1024.0;
|
|
|
|
public FileSize(long bytes) => Bytes = bytes;
|
|
|
|
public static FileSize Get(IOPath filePath) => new(File.GetSize(filePath));
|
|
|
|
public static FileSize Parse(string str)
|
|
{
|
|
var caseInvariant = str.ToLowerInvariant().AsSpan();
|
|
long multi = 1;
|
|
int skipLast = 0;
|
|
if (caseInvariant[^1] == 'b')
|
|
skipLast++;
|
|
switch (caseInvariant[^(1 + skipLast)])
|
|
{
|
|
case 'k':
|
|
multi = 1024;
|
|
skipLast++;
|
|
break;
|
|
case 'm':
|
|
multi = 1024*1024;
|
|
skipLast++;
|
|
break;
|
|
case 'b':
|
|
multi = 1024*1024*1024;
|
|
skipLast++;
|
|
break;
|
|
}
|
|
|
|
var numberStr = caseInvariant[..^skipLast].ToString();
|
|
double number = Convert.ToDouble(numberStr);
|
|
return new FileSize((long)(number * multi + 0.5));
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
if (GigaBytes > 1) return GigaBytes.ToString(CultureInfo.InvariantCulture) + "G";
|
|
if (MegaBytes > 1) return MegaBytes.ToString(CultureInfo.InvariantCulture) + "M";
|
|
if (KiloBytes > 1) return KiloBytes.ToString(CultureInfo.InvariantCulture) + "K";
|
|
return Bytes.ToString(CultureInfo.InvariantCulture);
|
|
}
|
|
} |