Salmon/Salmon.Model/Monitor/Drive.cs
2024-04-11 21:30:36 +02:00

122 lines
2.9 KiB
C#

using Salmon.Core.Cliff;
namespace Salmon.Model.Monitor;
public class Drive
: Hardware
{
[PersistentField]
public string? RootDirectory { get; set; }
[PersistentField]
public ulong? TotalSize { get; set; }
public string? TotalSizeHuman
{
get
{
if (TotalSize is null)
return null;
return Helper.SizeSuffix((long)TotalSize);
}
}
[PersistentField]
public ulong? FreeSpace { get; set; }
public string? FreeSpaceHuman
{
get
{
if (FreeSpace is null)
return null;
return Helper.SizeSuffix((long)FreeSpace);
}
}
public float? FreePercentSpace
{
get
{
if (TotalSize is null || FreeSpace is null)
return null;
return (float)FreeSpace / (float)TotalSize;
}
}
public string? FreePercentSpaceHuman
{
get
{
if (FreePercentSpace is null)
return null;
return $"{FreePercentSpace * 100:0.0}%";
}
}
[PersistentField]
public bool? IsReady { get; set; }
[PersistentField]
public string? Format { get; set; }
[PersistentField]
public string? Type { get; set; }
public Drive(string id)
: base(id)
{
}
public override IEnumerable<KeyValuePair<string, object>> ImportantProperties()
{
foreach(var i in base.ImportantProperties())
yield return new KeyValuePair<string, object>(i.Key, i.Value);
if(TotalSizeHuman is not null)
yield return new KeyValuePair<string, object>(nameof(TotalSizeHuman), TotalSizeHuman);
if (FreeSpaceHuman is not null)
yield return new KeyValuePair<string, object>(nameof(FreeSpaceHuman), FreeSpaceHuman);
if (FreePercentSpaceHuman is not null)
yield return new KeyValuePair<string, object>(nameof(FreePercentSpaceHuman), FreePercentSpaceHuman);
}
private static Drive FromDriveInfo(DriveInfo driveInfo)
{
string id = Helper.CreateIdFrom(Helper.GetMachineId(), driveInfo.Name);
var drive = new Drive(id)
{
ShortName = driveInfo.Name,
LongName = $"{Environment.MachineName}:{driveInfo.Name}",
RootDirectory = driveInfo.RootDirectory.FullName,
Type = driveInfo.DriveType.ToString(),
IsReady = driveInfo.IsReady,
ParentId = Helper.GetMachineId()
};
if (driveInfo.IsReady)
{
drive.TotalSize = (ulong)driveInfo.TotalSize;
drive.FreeSpace = (ulong)driveInfo.TotalFreeSpace;
drive.Format = driveInfo.DriveFormat;
}
return drive;
}
public static IEnumerable<Drive> FromAllLocalDrives()
{
foreach(var d in DriveInfo.GetDrives())
yield return Drive.FromDriveInfo(d);
}
}