using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace CZGL.SystemInfo { /// /// 磁盘信息 /// public class DiskInfo { private readonly DriveInfo _info; /// /// 获取磁盘类 /// public DriveInfo DriveInfo => _info; private DiskInfo(DriveInfo info) { _info = info; } /// /// 驱动器名称 /// ex: C:\ /// public string Id => _info.Name; /// /// 磁盘名称 /// ex:
/// Windows: system
/// Linux: /dev ///
///
public string Name => _info.Name; /// /// 获取驱动器类型 /// /// 获取驱动器类型,如 CD-ROM、可移动、网络或固定 public DriveType DriveType => _info.DriveType; /// /// 文件系统 /// /// Windows: NTFS、 CDFS...
/// Linux: rootfs、tmpfs、binfmt_misc... ///
///
public string FileSystem => _info.DriveFormat; /// /// 磁盘剩余容量(以字节为单位) /// public long FreeSpace => _info.AvailableFreeSpace; /// /// 磁盘总容量(以字节为单位) /// public long TotalSize => _info.TotalSize; /// /// 磁盘剩余可用容量 /// public long UsedSize => TotalSize - FreeSpace; /// /// 磁盘根目录位置 /// public string RootPath => _info.RootDirectory.FullName; /// /// 获取本地所有磁盘信息 /// /// public static DiskInfo[] GetDisks() { return DriveInfo.GetDrives().Where(x => x.IsReady).Select(x => new DiskInfo(x)).ToArray(); } /// /// 获取 Docker 运行的容器其容器文件系统在主机中的存储位置 /// /// 程序需要在宿主机运行才有效果,在容器中运行,调用此API获取不到相关信息 /// public static DiskInfo[] GetDockerMerge() { return DriveInfo.GetDrives() .Where(x => x.DriveFormat.Equals("overlay", StringComparison.OrdinalIgnoreCase) && x.DriveFormat.Contains("docker")) .Select(x => new DiskInfo(x)).ToArray(); } /// /// 筛选出真正能够使用的磁盘 /// /// public static DiskInfo[] GetRealDisk() { var disks = DriveInfo.GetDrives() .Where(x => x.DriveType == DriveType.Fixed && x.TotalSize != 0 && x.DriveFormat != "overlay"); return disks.Select(x => new DiskInfo(x)) .Distinct(new DiskInfoEquality()).ToArray(); } /// /// 筛选重复项 /// private class DiskInfoEquality : IEqualityComparer { public bool Equals(DiskInfo x, DiskInfo y) { return x?.Id == y?.Id; } public int GetHashCode(DiskInfo obj) { return obj.Id.GetHashCode(); } } } }