如何按名称打开卷

How to open volume by name

提问人:Brans 提问时间:8/13/2016 最后编辑:Brans 更新时间:8/13/2016 访问量:237

问:

我需要按名称打开卷(获取卷句柄)。目标卷名称为“\?\Volume{A25CF44F-8CB3-46E7-B3A7-931385FDF8CB}\”,这应该有效。根据 CreateFile 函数

您也可以通过引用卷名称来打开卷。

C# 代码:

public static class Wrapper
{
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
     public static extern SafeFileHandle CreateFile(
     [MarshalAs(UnmanagedType.LPTStr)] string filename,
     [MarshalAs(UnmanagedType.U4)] FileAccess access,
     [MarshalAs(UnmanagedType.U4)] FileShare share,
     IntPtr securityAttributes, // optional SECURITY_ATTRIBUTES struct or IntPtr.Zero
     [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
     [MarshalAs(UnmanagedType.U4)] FileAttributes flagsAndAttributes,
     IntPtr templateFile);
}

    static void Main(string[] args)
    {
        string sourceVol = @"\\?\Volume{A25CF44F-8CB3-46E7-B3A7-931385FDF8CB}\";

        SafeFileHandle sourceVolHandle = Wrapper.CreateFile(sourceVol, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete, IntPtr.Zero, FileMode.Open, 0, IntPtr.Zero);
        if (sourceVolHandle.IsInvalid)
            throw new Win32Exception(); //Here I got "The system cannot find the path specified"

那么如何按名称打开卷呢?(我知道我可以使用驱动器号“\\.\C:”打开音量,但这是不可接受的)

C# .NET WinAPI 与语言无关

评论

0赞 David Heffernan 8/13/2016
错误检查是错误的。阅读文档。检查返回值以检测错误。但是卷名可能都是错误的。
0赞 Brans 8/13/2016
@DavidHeffernan谢谢。我已经纠正了。但问题仍然是一样的。

答:

1赞 Brans 8/13/2016 #1

要打开音量,我们需要删除尾部斜杠,因此:

string sourceVol = @"\\?\Volume{A25CF44F-8CB3-46E7-B3A7-931385FDF8CB}";