将路径转换为UNC路径

M_M*_*abi 2 c# unc

我试过这段代码将我的路径转换为UNC路径:

[DllImport("mpr.dll", CharSet = CharSet.Unicode)]
[return:MarshalAs(UnmanagedType.U4)]
static extern int WNetGetUniversalName(
    string lpLocalPath,
    [MarshalAs(UnmanagedType.U4)] int dwInfoLevel,
    IntPtr lpBuffer,
    [MarshalAs(UnmanagedType.U4)] ref int lpBufferSize);

const int UNIVERSAL_NAME_INFO_LEVEL = 0x00000001;
const int REMOTE_NAME_INFO_LEVEL = 0x00000002;

const int ERROR_MORE_DATA = 234;
const int NOERROR = 0;    

static string GetUniversalName(string localPath)
{
    // The return value.
    string retVal = null ;

    // The pointer in memory to the structure.
    IntPtr buffer = IntPtr.Zero;

    // Wrap in a try/catch block for cleanup.
    try
    {
        // First, call WNetGetUniversalName to get the size.
        int size = 0;

        // Make the call.
        // Pass IntPtr.Size because the API doesn't like null, even though
        // size is zero.  We know that IntPtr.Size will be
        // aligned correctly.
        int apiRetVal = WNetGetUniversalName(localPath, UNIVERSAL_NAME_INFO_LEVEL, (IntPtr) IntPtr.Size, ref size);

        // If the return value is not ERROR_MORE_DATA, then
        // raise an exception.
        if (apiRetVal != ERROR_MORE_DATA)
            // Throw an exception.
            throw new Win32Exception(apiRetVal);

        // Allocate the memory.
        buffer = Marshal.AllocCoTaskMem(size);

        // Now make the call.
        apiRetVal = WNetGetUniversalName(localPath, UNIVERSAL_NAME_INFO_LEVEL, buffer, ref size);

        // If it didn't succeed, then throw.
        if (apiRetVal != NOERROR)
            // Throw an exception.
            throw new Win32Exception(apiRetVal);

        // Now get the string.  It's all in the same buffer, but
        // the pointer is first, so offset the pointer by IntPtr.Size
        // and pass to PtrToStringAnsi.
        retVal = Marshal.PtrToStringAuto(new IntPtr(buffer.ToInt64() + IntPtr.Size), size);
        retVal = retVal.Substring(0, retVal.IndexOf('\0'));
    }
    finally
    {
        // Release the buffer.
        Marshal.FreeCoTaskMem(buffer);
    }

    // First, allocate the memory for the structure.

    // That's all folks.
    return retVal;
}
Run Code Online (Sandbox Code Playgroud)

但是当我将路径\\myservername\sharedfoldername发送到此方法时,我收到此错误:

指定的设备名称无效.

我的错是什么?

Arn*_*out 7

来自MSDN(强调我的):

WNetGetUniversalName函数为网络资源采用基于驱动器的路径,并返回包含更通用形式的名称的信息结构.

你传递一个UNC路径,但功能需要一个基于驱动器的路径(即像X:\foo\bar),然后会返回一个UNC路径.

  • 我不明白你的问题......`\\ myservername\sharedfoldername`*是*UNC路径.你究竟想做什么? (2认同)
  • 好吧,像`\\ servername\sharedfoldername\...`**这样的路径是UNC格式的**...你可能会反过来尝试:将驱动器号映射到该共享,然后查看AutoCAD是否可以打开` X:\ protectedfoldername\File1.dwg`. (2认同)