[英]How can I get unlabeled volume drive total size by C#?
我正在使用 C# 來調查 Windows 驅動器。
如何使用 RAW Partition 獲取卷的大小?
首先有一些東西來代表一個體積:
public class Volume
{
public Volume(string path)
{
Path = path;
ulong freeBytesAvail, totalBytes, totalFreeBytes;
if (GetDiskFreeSpaceEx(path, out freeBytesAvail, out totalBytes, out totalFreeBytes))
{
FreeBytesAvailable = freeBytesAvail;
TotalNumberOfBytes = totalBytes;
TotalNumberOfFreeBytes = totalFreeBytes;
}
}
public string Path { get; private set; }
public ulong FreeBytesAvailable { get; private set; }
public ulong TotalNumberOfBytes { get; private set; }
public ulong TotalNumberOfFreeBytes { get; private set; }
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool GetDiskFreeSpaceEx([MarshalAs(UnmanagedType.LPStr)]string volumeName, out ulong freeBytesAvail,
out ulong totalBytes, out ulong totalFreeBytes);
}
接下來有一個簡單的卷枚舉器:
public class VolumeEnumerator : IEnumerable<Volume>
{
public IEnumerator<Volume> GetEnumerator()
{
StringBuilder sb = new StringBuilder(2048);
IntPtr volumeHandle = FindFirstVolume(sb, (uint)sb.MaxCapacity);
{
if (volumeHandle == IntPtr.Zero)
yield break;
else
{
do
{
yield return new Volume(sb.ToString());
sb.Clear();
}
while (FindNextVolume(volumeHandle, sb, (uint)sb.MaxCapacity));
FindVolumeClose(volumeHandle);
}
}
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr FindFirstVolume([Out] StringBuilder lpszVolumeName,
uint cchBufferLength);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool FindNextVolume(IntPtr hFindVolume, [Out] StringBuilder lpszVolumeName, uint cchBufferLength);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool FindVolumeClose(IntPtr hFindVolume);
}
最后使用它的示例代碼:
foreach (Volume v in new VolumeEnumerator())
{
Console.WriteLine("{0}, Free bytes available {1} Total Bytes {2}", v.Path,
v.FreeBytesAvailable, v.TotalNumberOfBytes);
}
這一切都來自將 P/Invokes 構建到Volume Management API 中。 如果這不是您想要的,您可能會在那里找到特定信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.