2009-01-16 17 views
6

Cómo crear una copia de un archivo de longitud que tiene más de 260 caracteres, incluyendo nombre de archivo utilizando vb.netCómo crear una copia de un archivo que tiene una longitud de más de 260 caracteres

Cuando estamos tratando de crear una copia utilizando el método File.Copy arroja la excepción de la siguiente manera:

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

¿Es posible, entonces por favor ayuda ...

Respuesta

2

hay consejos para acortar el nombre ... consulte la sección titulada "Causa 4: Archivos existe en caminos que son más profundas que MAX_PATH caracteres" en http://support.microsoft.com/?kbid=320081#

+0

Es una restricción de Windows. si el FilePath supera los 260 caracteres, la mayoría de las operaciones de archivos arrojarían errores similares. Incluso el cambio de nombre del archivo tendría problemas, creo que – Gishu

+0

La respuesta de Matt (use 'CopyFile') es mejor que la mía. – ChrisW

9

Se está cumpliendo la limitación MAX_PATH. Como un trabajo a su alrededor, debe poder P/invocar directamente a la función CopyFile de kernel32.dll y usar el prefijo "\\? \" Delante de la ruta de destino para evitar golpear el problema MAX_PATH.

Tenga en cuenta que si bien puede copiar el archivo de la misma forma que la mayoría de las aplicaciones no podrán abrirlo, ya que también están limitadas por MAX_PATH.

Una buena visión general del problema se puede encontrar aquí: http://blogs.msdn.com/bclteam/archive/2007/02/13/long-paths-in-net-part-1-of-3-kim-hamilton.aspx

un código de ejemplo de P/Al invocar en estos métodos utilizando C# se puede encontrar en la Parte 2, aquí: http://blogs.msdn.com/bclteam/archive/2007/03/26/long-paths-in-net-part-2-of-3-long-path-workarounds-kim-hamilton.aspx

la biblioteca que schnaader linked parece que le ahorrará el problema de P/Invocar en kernel32.dll, no estoy seguro de si desea tomar una dependencia de un dll externo o no.

0

Lo que suele hacer en este caso es:

1) Contar el nombre del archivo length

2) Si FileNameLength > 259 después recortar el nombre del archivo suficiente para manejar el nuevo nombre y luego copiar el archivo con una nombre de destino recortado.

1

Tengo una solución con respecto a este problema.

En R & D Encontré que podemos cambiar el nombre del directorio de ruta especificado aunque la longitud total sea superior a 260 caracteres y luego podamos copiar el archivo desde la ubicación especificada a la nueva ubicación (temporal) para nuestro propósito de exploración. Y finalmente podemos volver a nombrar el nombre de la ruta del archivo con la original.

0

jdelimon ya apuntó a la biblioteca Delimon.Win32.IO pero la última vez que actualizaron esto fue 2012 (.Net 2.0). Aquí hay otra biblioteca: AlphaFS

Suben a .Net 4.5.2 (el 29/6/2017). Usé un programa #C muy corto para ser utilizado como complemento COM por Excel. Ver this link in how to create a program y this link for the copy-program. Solo debe asignar el Programa a .NET 4.5, agregue la referencia a AlphaFS.dll para 4.5 y reemplace using System.IO con using Alphaleonis.Win32.Filesystem;.

Cuestiones relacionadas