2009-08-31 20 views

Respuesta

8

Por lo que sé, no es posible. Si bien es posible utilizar una solución para las transmisiones como Phoenix mencionó, no es posible manejar los nombres de los archivos. Internamente, cada clase que trabaja con nombres de archivos realiza comprobaciones de nombres de archivos largos.

Puede crear instancias de FileInfo y rellenar a los memebers privados mediante la reflexión (sin embargo, esto no se recomienda) y hacer que FileInfo apunte al archivo con una ruta larga. Pero cuando intente utilizar este objeto, seguirá recibiendo las excepciones PathTooLongException, porque, por ejemplo, la clase Path (muy utilizada por FileInfo) comprueba la ruta larga en cada llamada a un método.

Por lo tanto, solo hay una forma correcta de obtener compatibilidad con rutas largas sin problemas: implemente su propio conjunto de clases que imitará el comportamiento de FileInfo. No es muy complejo (solo seguridad tal vez), pero consume mucho tiempo.

Actualización: Aquí incluso dos soluciones listas para este problema: AlpfaFS y Zeta Long Paths

+0

+1; el enlace Zeta Long Paths me dio exactamente lo que necesitaba. La llamada a la API 'FindFirstFile' es el elemento clave para replicar' FileInfo'. –

+0

AlphaFS hizo el truco para mí. gracias – bjoern

7

aquí en el trabajo que lidiar con caminos largos con bastante frecuencia, y por lo tanto tuvimos que rodar básicamente nuestra propia System.IO para hacerlo . Bueno, en realidad no, pero hemos reescrito File, Directory, FileInfo, DirectoryInfo y Path solo por nombrar algunos. La premisa básica es que todo es posible desde una perspectiva API Win32, por lo que todo lo que necesitas hacer al final del día es invocar las versiones Unicode de las funciones API de Win32, y entonces estás bien. Es un montón de trabajo, y puede ser un dolor en el culo a veces, pero realmente no hay mejor manera de hacerlo.

+0

¿cómo se ven tus nuevas clases, están 100% escritas a mano o subclases la clase de archivo incorporada dentro de tu clase de archivo? –

+3

Bueno, File es en realidad una clase estática, por lo que no puede heredar de ella, pero la mayoría de las clases que consideraría subclasificar (FileInfo, DirectoryInfo) están selladas, por lo que no puede subclasificarlas. Los escribimos todos desde cero. No voy a mentir, utilizamos el reflector ALOT :) – BFree

+0

Doh, sí, estático :) Bastante bien, gran respuesta. –

0

Hay una gran biblioteca en Microsoft TechNet para superar el problema largo nombres de archivo, se llama Delimon.Win32.I​O Library (V4.0) y tiene sus propias versiones de los principales métodos de System.IO

Por ejemplo, debería reemplazar:

System.IO.Directory.GetFiles 

con

Delimon.Win32.IO.Directory.GetFiles 

que le permitirá h y archivos largos y carpetas.

Desde el sitio web:

Delimon.Win32.IO reemplaza las funciones básicas del archivo de System.IO y compatible con archivos & nombres de las carpetas hasta un máximo de 32.767 caracteres.

Esta biblioteca está escrita en .NET Framework 4.0 y se puede usar en x86 & x64 systems. El archivo & Limitaciones de carpeta del espacio de nombres estándar System.IO puede trabajar con archivos que tienen 260 caracteres en un nombre de archivo y 240 caracteres en un nombre de carpeta (MAX_PATH suele ser configurado como 260 caracteres).Normalmente se encuentra con el System.IO.PathTooLongException Error con la Biblioteca .NET estándar.

1

Solo necesitaba usar la propiedad FullName pero también recibía la PathTooLongException.

El uso de la reflexión para extraer el valor FullPath fue suficiente para resolver mi problema:

private static string GetFullPath(FileInfo src) 
{ 
    return (string)src.GetType() 
     .GetField("FullPath", BindingFlags.Instance|BindingFlags.NonPublic) 
     .GetValue(src); 
} 
Cuestiones relacionadas