Files
2025-08-26 08:37:44 +08:00

130 lines
3.6 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace CZGL.SystemInfo
{
/// <summary>
/// 磁盘信息
/// </summary>
public class DiskInfo
{
private readonly DriveInfo _info;
/// <summary>
/// 获取磁盘类
/// </summary>
public DriveInfo DriveInfo => _info;
private DiskInfo(DriveInfo info)
{
_info = info;
}
/// <summary>
/// 驱动器名称
/// <para>ex: C:\</para>
/// </summary>
public string Id => _info.Name;
/// <summary>
/// 磁盘名称
/// <para>ex:<br />
/// Windows: system<br />
/// Linux: /dev
/// </para>
/// </summary>
public string Name => _info.Name;
/// <summary>
/// 获取驱动器类型
/// </summary>
/// <remarks>获取驱动器类型,如 CD-ROM、可移动、网络或固定</remarks>
public DriveType DriveType => _info.DriveType;
/// <summary>
/// 文件系统
/// <para>
/// Windows: NTFS、 CDFS...<br />
/// Linux: rootfs、tmpfs、binfmt_misc...
/// </para>
/// </summary>
public string FileSystem => _info.DriveFormat;
/// <summary>
/// 磁盘剩余容量(以字节为单位)
/// </summary>
public long FreeSpace => _info.AvailableFreeSpace;
/// <summary>
/// 磁盘总容量(以字节为单位)
/// </summary>
public long TotalSize => _info.TotalSize;
/// <summary>
/// 磁盘剩余可用容量
/// </summary>
public long UsedSize => TotalSize - FreeSpace;
/// <summary>
/// 磁盘根目录位置
/// </summary>
public string RootPath => _info.RootDirectory.FullName;
/// <summary>
/// 获取本地所有磁盘信息
/// </summary>
/// <returns></returns>
public static DiskInfo[] GetDisks()
{
return DriveInfo.GetDrives().Where(x => x.IsReady).Select(x => new DiskInfo(x)).ToArray();
}
/// <summary>
/// 获取 Docker 运行的容器其容器文件系统在主机中的存储位置
/// </summary>
/// <remarks>程序需要在宿主机运行才有效果在容器中运行调用此API获取不到相关信息</remarks>
/// <returns></returns>
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();
}
/// <summary>
/// 筛选出真正能够使用的磁盘
/// </summary>
/// <returns></returns>
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();
}
/// <summary>
/// 筛选重复项
/// </summary>
private class DiskInfoEquality : IEqualityComparer<DiskInfo>
{
public bool Equals(DiskInfo x, DiskInfo y)
{
return x?.Id == y?.Id;
}
public int GetHashCode(DiskInfo obj)
{
return obj.Id.GetHashCode();
}
}
}
}