在Windows操作系统中,每个格式化的卷都会被系统分配一个全局唯一的标识符,也就是卷GUID。通过C#程序获取并使用这个标识符,可以避免依赖容易变化的盘符,从而提升程序的稳定性。

什么是卷GUID
卷GUID是系统为卷生成的唯一ID,表现形式通常为 \?Volume{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}。即使盘符改变,这个路径依然指向同一个卷。在C#中我们可以使用Windows API来查询。
使用C#获取卷GUID
我们可以调用 kernel32.dll 中的 FindFirstVolume 和 FindNextVolume 函数来枚举系统中的所有卷GUID。
using System;
using System.Runtime.InteropServices;
using System.Text;
class VolumeHelper
{
// 引入Windows API
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
static extern IntPtr FindFirstVolume(StringBuilder volumeName, uint volumeNameLength);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
static extern bool FindNextVolume(IntPtr hFindVolume, StringBuilder volumeName, uint volumeNameLength);
[DllImport("kernel32.dll")]
static extern bool FindVolumeClose(IntPtr hFindVolume);
public static void ListVolumeGuids()
{
// 存放卷名的缓冲区
StringBuilder buf = new StringBuilder(256);
// 查找第一个卷
IntPtr handle = FindFirstVolume(buf, (uint)buf.Capacity);
if (handle.ToInt64() != -1)
{
do
{
Console.WriteLine("卷GUID: " + buf.ToString());
} while (FindNextVolume(handle, buf, (uint)buf.Capacity));
FindVolumeClose(handle);
}
}
}
如何使用卷GUID访问文件
拿到卷GUID路径后,可以直接把它当作目录来使用。例如下面的代码列出该卷根目录的文件:
using System;
using System.IO;
class UseVolumeGuid
{
public static void ShowRootFiles(string volumeGuid)
{
// volumeGuid格式如 \?Volume{...}
string root = volumeGuid;
if (!root.EndsWith("\"))
{
root += "\";
}
// 获取根目录文件
foreach (string file in Directory.GetFiles(root))
{
Console.WriteLine(file);
}
}
}
注意事项
- 卷GUID路径需要以反斜杠结尾才能作为目录访问。
- 部分卷可能没有挂载盘符,但依然拥有GUID。
- 访问系统卷可能需要管理员权限。
通过合理使用卷GUID,C#程序能够更可靠地定位和管理存储设备,适合做长期运行的系统工具。
C#Windows卷GUID文件系统修改时间:2026-07-30 23:18:19