Dans Delphi, il existe une fonction EXTROWNEFFILENAME qui prend dans un nom de fichier et la convertit dans l'équivalent UNC. Il élargit les lecteurs mappés et saute des emplacements locaux et déjà étendus. P>
échantillons p>
c: \ dossier \ text.txt -> c: \ dossier \ text.txt
L: \ dossier \ samder.txt -> \\ serveur \ folder1 \ dossier \ sample.txt où l: est mappé sur \\ serveur \ dossier1 \
\\ serveur \ dossier \ sample.odf -> \ serveur \ dossier \ sample.odf p>
Y a-t-il un moyen simple de le faire en C # ou devrai-je utiliser l'appel Windows API WnetgetConnection, puis vérifier manuellement ceux qui ne seraient pas mappés? P>
4 Réponses :
Il n'y a pas de fonction intégrée dans la BCL qui fera l'équivalent. Je pense que la meilleure option que vous avez est d'tinter dans WnetGetConnection comme vous l'avez suggéré. p>
p / invoquer Je l'ai fait modifier Ce code de www.pinvoke .NET. P> wnegegetUniversalname () code>. p>
Essayez ce code est écrit dans Delphi .NET strud> Vous devez le traduire en C # P> 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;
Voici un certain code C # avec une fonction wrapper localTounc, qui semble fonctionner correctement, bien que je ne l'ai pas testé de manière approfondie.
[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); } }
+1 à cause de marshal.readintptr (lpbuff) code> pour obtenir sur le tampon à cordes. Ceci est plus propre que l'exemple supérieur sur Pinvoke.net, où ils font du pointeur de pointe artifty arithmétique car ils rendent l'hypothèse sans papiers que le tampon à chaîne est situé directement derrière le
Universal_name_info code> struct.