2011-08-22 8 views
9

Tengo archivos en mi disco duro que arrojan un PathTooLongException cuando tengo acceso a la propiedad Fullname de un objeto FileSystemInfo. ¿Hay alguna forma de evitar esto (excluyendo el cambio de nombre de los archivos que no es una opción)?¿Alguna forma de evitar la excepción PathTooLongException que FileSystemInfo.Fullname arroja a veces?

http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx#maxpath ha mencionado en otras respuestas sugiere poniendo un "\? \" Prefijo en el nombre del archivo, pero en este caso el DirectoryInfo.GetFileSystemInfos() es responsable de crear los FileSystemInfo objetos y DirectoryInfo no acepta ese prefijo así que no hay manera de usarlo .

La respuesta "PathTooLongException in C# code" no ayuda porque esta es una aplicación de subprocesos múltiples y no puedo seguir cambiando la ruta actual de la aplicación.

¿Realmente tengo que hacer todo con PInvoke solo para poder leer todos los archivos en el disco duro?

+1

¿Ha intentado: http://www.codeproject.com/KB/files/LongFileNames.aspx? –

Respuesta

3

Esto parece interesante ... Codeplex Long Path Wrapper

La envoltura larga trayectoria proporciona la funcionalidad para que sea más fácil trabajar con caminos que son más largos que el actual límite de 259 caracteres de espacio de nombres System.IO. Con las clases de ruta larga, los proyectos ahora pueden usar rutas de hasta 32,000 caracteres.

Voy a intentarlo, aunque observo inmediatamente que no proporciona un método equivalente al DirectoryInfo.GetFileSystemInfos(), así que va a necesitar algunas modificaciones.

2

No hay muchos programas que puedan sobrevivir a un camino de más de 259 caracteres. Límite bastante difícil para la capa de winapi, MAX_PATH está en todas partes. Se ha considerado para .NET pero sin resultados concretos. Publicación de blog serie ends here con enlaces a entradas anteriores en la parte inferior.

2

Trabajar correctamente con rutas largas no es tan difícil - SetACL lo hace, por ejemplo. Pero:

  • las clases del framework .NET no son compatibles con rutas largas por lo que no se les puede utilizar
  • que necesita para escribir un contenedor para cada función de la API del sistema de archivos para que utilice el largo camino correcto tanto para los locales y las rutas UNC

Aquí está la documentación en MSDN acerca de las rutas largas: http://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx

1

A partir de Windows 10 (o Windows Server 2016) y .Net 4.6.2, las rutas largas pueden ser soportadas directamente si se activa una configuración de registro, y su aplicación está marcada como "larga ruta de acceso".

El ajuste se puede acceder a través del Editor de directivas de grupo local (gpedit.msc), bajo Configuración del equipo>Plantillas administrativas>todos los ajustes>Habilitar rutas largas Win32

Con el fin de marcar su aplicación como "larga ruta de acceso", agregue esta sección a su archivo de manifiesto:

<application xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <windowsSettings> 
    <longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware> 
    </windowsSettings> 
</application> 

Additiona LLY, si la aplicación se dirige a una versión de .NET Framework 4.6.2 antes de lo, tendrá que añadir una sección a su archivo App.config:

<configuration> 
    <runtime> 
    <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false" /> 
    </runtime> 
</configuration> 

Para más información ver:
https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/ https://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx

(Por lo que yo sé, esto sólo afecta a las API del sistema de archivos de Windows básicos. Las API sin sistema de archivos aún pueden estar limitadas a 260 caracteres)

Cuestiones relacionadas