2009-09-09 10 views
14

Estoy tratando de crear una unión NTFS. Desde la línea de cmd puedo hacerlo usando junction.exe tool from sysinternals. La salida de un cmd DIR para una unión se ve así:En .NET, ¿cómo creo un cruce en NTFS, a diferencia de un enlace simbólico?

Volume in drive C has no label. 
Volume Serial Number is C8BC-2EBD 

Directory of c:\users\cheeso\Documents 

03/22/2009 09:45 PM <JUNCTION>  My Music [\??\c:\users\cheeso\Music] 
05/11/2007 05:42 PM <DIR>   My Received Files 
03/22/2009 09:46 PM <JUNCTION>  my videos [\??\c:\users\cheeso\Videos] 

leí en alguna parte que las uniones son un subconjunto de enlaces simbólicos.

Así que traté de usar CreateSymbolicLink para crear una unión. Cuando hago esto, en realidad obtengo un enlace simbólico, no un cruce.

09/09/2009 11:50 AM <SYMLINKD>  newLink [.\] 

También hay CreateHardLink. El documento allí dice que las uniones (también conocidas como "puntos de análisis") son un subconjunto de enlaces duros. pero parece que no puedo hacer que esta llamada funcione. Se completa pero no hay un enlace fijo o unión creada.

estoy usando .NET/C# y las importaciones tener este aspecto:

[Interop.DllImport("kernel32.dll", EntryPoint="CreateSymbolicLinkW", CharSet=Interop.CharSet.Unicode)] 
    public static extern int CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, int dwFlags); 

    [Interop.DllImport("kernel32.dll", EntryPoint="CreateHardLinkW", CharSet=Interop.CharSet.Unicode)] 
    public static extern bool CreateHardLink(string lpFileName, 
              string lpExistingFileName, 
              IntPtr mustBeNull); 

¿Qué estoy haciendo mal?
¿Cómo puedo crear un cruce desde C#?

Respuesta

11

Parece que puede, y alguien creó una biblioteca en CodeProject que tiene una serie de funciones que han construido en C# para trabajar con puntos de unión.

http://www.codeproject.com/KB/files/JunctionPointsNet.aspx

Parece que en realidad está utilizando la siguiente DllImport para lograrlo:

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern bool DeviceIoControl(IntPtr hDevice, uint dwIoControlCode, 
     IntPtr InBuffer, int nInBufferSize, 
     IntPtr OutBuffer, int nOutBufferSize, 
     out int pBytesReturned, IntPtr lpOverlapped); 
+0

perfecta, gracias! Miré y encontré algunos enlaces, pero no ese, y nada que fuera realmente utilizable. – Cheeso

+1

También le importa pasar un ejemplo de uso, ya que el enlace que publicó es (por el momento) válido, pero podría fallar en el futuro, + uno necesita registrarse en esa página para descargar las fuentes y ver el código como ¿bien? Sería realmente la respuesta completa aquí entonces. ¡Gracias! :) –

Cuestiones relacionadas