从本地路径或映射路径获取UNC路径

在Delphi中有一个函数ExpandUNCFileName,它接受一个文件名并将其转换为UNC等价物。 它扩展了映射驱动器并跳过本地和已扩展的位置。

样品

C:\ Folder \ Text.txt – > C:\ Folder \ Text.txt
L:\ Folder \ Sample.txt – > \\ server \ Folder1 \ Folder \ Sample.txt其中L:映射到\\ server \ Folder1 \
\\ server \ Folder \ Sample.odf – > \ server \ Folder \ Sample.odf

有没有一种简单的方法在C#中执行此操作或者我是否必须使用Windows api调用WNetGetConnection然后手动检查那些无法映射的?

BCL中没有内置function可以完成相同的function。 我认为你最好的选择是按照你的建议进入WNetGetConnection。

P / Invoke WNetGetUniversalName()

我已经从www.pinvoke.net修改了这段代码 。

这里有一些带有包装函数LocalToUNC的C#代码,虽然我没有对它进行过广泛的测试,但它似乎运行正常。

  [DllImport("mpr.dll")] static extern int WNetGetUniversalNameA( string lpLocalPath, int dwInfoLevel, IntPtr lpBuffer, ref int lpBufferSize ); // I think max length for UNC is actually 32,767 static string LocalToUNC(string localPath, int maxLen = 2000) { IntPtr lpBuff; // Allocate the memory try { lpBuff = Marshal.AllocHGlobal(maxLen); } catch (OutOfMemoryException) { return null; } try { int res = WNetGetUniversalNameA(localPath, 1, lpBuff, ref maxLen); if (res != 0) return null; // lpbuff is a structure, whose first element is a pointer to the UNC name (just going to be lpBuff + sizeof(int)) return Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(lpBuff)); } catch (Exception) { return null; } finally { Marshal.FreeHGlobal(lpBuff); } } 

试试这段代码,是用Delphi .Net编写的

你必须把它翻译成c#

 function WNetGetUniversalName; external; [SuppressUnmanagedCodeSecurity, DllImport(mpr, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'WNetGetUniversalNameA')] function ExpandUNCFileName(const FileName: string): string; function GetUniversalName(const FileName: string): string; const UNIVERSAL_NAME_INFO_LEVEL = 1; var Buffer: IntPtr; BufSize: DWORD; begin Result := FileName; BufSize := 1024; Buffer := Marshal.AllocHGlobal(BufSize); try if WNetGetUniversalName(FileName, UNIVERSAL_NAME_INFO_LEVEL, Buffer, BufSize) <> NO_ERROR then Exit; Result := TUniversalNameInfo(Marshal.PtrToStructure(Buffer, TypeOf(TUniversalNameInfo))).lpUniversalName; finally Marshal.FreeHGlobal(Buffer); end; end; begin Result :=System.IO.Path.GetFullPath(FileName); if (Length(Result) >= 3) and (Result[2] = ':') and (Upcase(Result[1]) >= 'A') and (Upcase(Result[1]) <= 'Z') then Result := GetUniversalName(Result); end; 

再见。