2012-06-13 30 views
5

estoy corriendo un programa muy simple, que está tratando de listar los archivos en una carpeta en la misma máquina, que se especifica utilizando el formato UNC (como se describe en http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx):¿La ruta UNC no funciona con .NET?


static string rootDir = @"\\?\d:\share\input";

static void Main(string[] args) { char[] invlidChars = Path.GetInvalidPathChars(); foreach (char invChar in invlidChars) { if (rootDir.Contains(invChar.ToString())) { Console.WriteLine("InvChar - {0}", invChar); } } string[] matchFiles = Directory.GetFiles(rootDir); }

Sin embargo Directory.GetFiles() no funciona y arroja una ArgumentException (que se inicia cuando la ruta es una cadena de longitud cero, contiene solo espacios en blanco o contiene uno o más caracteres no válidos tal como lo define InvalidPathChars.). Console.Writeline() no imprime nada, lo que confirma que no hay caracteres no válidos en la ruta. Obtengo la misma excepción cuando uso "\\ UNC \? \ D: \ share \ input" o "\\ UNC \? \ Machinename \ share \ input" o "\\? \ Machinename \ share \ input ".

La "d: \ share \ input" es de hecho una carpeta compartida.

¿Alguien sabe lo que podría estar mal?

Gracias!

+0

Recomiendo esta visión general pero aún relevante de las rutas largas, la limitación de MAXPATH, el prefijo \\? \ Y otros problemas de .NET: http://blogs.msdn.com/b/bclteam/archive/2007/02/ 13/long-paths-in-net-part-1-of-3-kim-hamilton.aspx –

+0

Gracias por el enlace Avner SK; Esto aclara el comportamiento de .NET y Windows-API con rutas largas. – whywhywhy

Respuesta

8

El problema es que \\?\ es una convención de Windows API que no es compatible con .NET. Si se lee con cuidado en su enlace \\?\ no denota una ruta UNC, pero es una convención especial para la API de Windows:

Para archivo de E/S, el "\\?\" prefijo a una cadena de ruta indica a los de Windows API I para deshabilitar todo el análisis de cadenas y enviar la cadena que sigue al directamente al sistema de archivos.

Un formato UNC compatible con .NET sería \\machinename\d$\share\input. Ver this respuesta para más información.

La razón por la que no es compatible con .NET es muy probable que la convención de ruta extendida no esté disponible en todas las plataformas y, por lo tanto, no se puede garantizar que funcione con el marco.

+0

Gracias por la respuesta Mike Z. Como señala, \\? \ No es parte de UNC sino de Windows específico. ¡Esto responde la pregunta! – whywhywhy

Cuestiones relacionadas