2012-03-06 26 views
9

Cuando recursivo a través de algunas carpetas y archivos, encuentro este error:C# ¿Cómo puedo resolver las limitaciones cuando uso DirectoryInfo?

La ruta especificada, el nombre del archivo o ambos son demasiado largos. El nombre de archivo completo debe tener menos de 260 caracteres y el nombre de directorio debe tener menos de 248 caracteres.

Aquí es mi función

private void ProcessDirectory(DirectoryInfo di) 
{ 
    try 
    { 
     DirectoryInfo[] diArr = di.GetDirectories(); 

     foreach (DirectoryInfo directoryInfo in diArr) 
     { 
      if (StopCheck) 
        return; 
      ProcessDirectory(directoryInfo); 
     } 
     ProcessFile(di); 
    } 
    catch (Exception e) 
    { 
     listBoxError.Items.Add(e.Message); 
    } 

    TextBoxCurrentFolder.Text = di.ToString(); 
} 

no puedo hacer que los nombres de los directorios más corto, porque no se me permite también, así que ... ¿Cómo puedo solucionar este problema?

Agregado: Aquí está la otra función:

private void ProcessFile(DirectoryInfo di) 
{ 
    try 
    { 
     FileInfo[] fileInfo = di.GetFiles(); 

     if (fileInfo.LongLength != 0) 
     { 
      foreach (FileInfo info in fileInfo) 
      { 
       Size += info.Length; 
       CountFile++; 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     listBoxError.Items.Add(e.Message); 
    } 
} 

EDITAR Encontramos este donde utilizó Zeta largos caminos: How can I use FileInfo class, avoiding PathTooLongException?

lo han implementado y ahora voy a deje que el programa se ejecute durante la noche para ver si funciona.

EDIT Usé el ZetaLongPath ayer y funcionó de maravilla! Incluso pasó por carpetas que necesitaban permiso de acceso.

EDITAR En lugar de zetalongPath, he utilizado Delimon.Win32.IO.dll que creo que es mucho mejor. Tiene las mismas interfaces que Win32.

+0

supongo que tienes que volver a la API normal de Windows (FindFirst */FindNext *) –

+0

lo hace se produce el error desde el interior de 'ProcessFile()', tal vez que el código puede ser cambiado si podemos verlo? – musefan

+0

¿Sabía que es el primero en la subcarpeta más profunda antes de comenzar a procesar los archivos? Si desea comenzar con la carpeta raíz, debe mover 'ProcessFile (di);' al inicio del método. –

Respuesta

8

Aquí hay más información sobre la biblioteca Delimon mencionada anteriormente. Su biblioteca .NET Framework 4 basado en Microsoft TechNet para superar el problema a largo nombres de archivo:

Delimon.Win32.I​O Library (V4.0).

Tiene sus propias versiones de métodos clave de System.IO. Por ejemplo, debería reemplazar:

System.IO.Directory.GetFiles 

con

Delimon.Win32.IO.Directory.GetFiles 

que le permitirá gestionar los archivos y carpetas largas.

Desde el sitio web:

Delimon.Win32.IO replaces basic file functions of System.IO and supports File & Folder names up to up to 32,767 Characters.

This Library is written on .NET Framework 4.0 and can be used either on x86 & x64 systems. The File & Folder limitations of the standard System.IO namespace can work with files that have 260 characters in a filename and 240 characters in a folder name (MAX_PATH is usually configured as 260 characters). Typically you run into the System.IO.PathTooLongException Error with the Standard .NET Library.

+0

Heres otra alternativa posible llamada AlphaFS: https://github.com/alphaleonis/AlphaFS – TripleAntigen

1

Esto es una limitación conocida en Windows: http://msdn.microsoft.com/en-us/library/aa365247.aspx

No creo que usted será capaz de conseguir alrededor de él, así que quien le está diciendo que no se le permite hacerlos más corto, que' Tendré un argumento bastante sólido sobre por qué tienes que hacerlo.

La única alternativa real es mover la carpeta profunda a otra parte, tal vez directamente a la raíz de la unidad.

EDIT: En realidad puede haber una solución: http://www.codinghorror.com/blog/2006/11/filesystem-paths-how-long-is-too-long.html

1

Usted puede utilizar el comando subst. Crea una unidad virtual que comienza en cualquier carpeta que pase como parámetro.

Por ejemplo, puede activar la ruta C: \ aaaaaaaaaaaaaaaaaaaaaa \ aaaaaaaaaaaaaaaaaaaa \ aaaaaaaaaaaaaa en la unidad R: y continuar explorando las subcarpetas de C: \ aaaaaaaaaaaaaaaaaaaaaa \ aaaaaaaaaaaaaaaaaaaa \ aaaaaaaaaaaaaa través R: ...

Do ¿Sabes a lo que me refiero?

0

También recomiendo la lectura de este three-part blog post del equipo de BCL, publicado en 2007, pero que corresponden específicamente a las limitaciones de DirectoryInfo cuando se trata de a carpetas profundamente anidadas. Cubre el historial de la limitación MAX_PATH, el formato \? \ Path más nuevo y varias soluciones basadas en .NET y soluciones alternativas.

Completo, aunque quizás un poco anticuado.

Cuestiones relacionadas