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();
}
}
}
}