2010-08-11 25 views
7

Hay alguna carpeta con más de 100 archivos. Pero todos los nombres de archivos y carpetas están rotos con nombres de codificación incorrectos (UTF-> ANSI).Buscar nombres de archivo largos (> 255)

"C:\...\Госдача-Лечебни корпус\вертолетка\Госдача-Лечебни корпус\Госдача-Лечебни корпус\вертолетка\Госдача-Лечебни корпус\вертолетка\Госдача-Лечебни корпус\Госдача-Лечебни корпус\Госдача-Лечебни корпус\вертолетка\Госдача-Лечебни корпус\Госдача-Лечебни корпус\вертолетка\Госдача-Лечебни корпус\..." 

función regular Utf8ToAnsi finxing, pero FindFirst no puede buscar las carpetas con los nombres de más de 255 símbolos.

Me da solo 70/100 archivos.

Respuesta

13

FindFirst envuelve la función API de Win32 FindFirstFile, y la versión Unicode de esa función puede buscar caminos de hasta 32.767 caracteres, si antepones \\?\ al camino que está pasando en, como \\?\C:\Folder\Folder\*.

Dado que Delphi 2009 y posteriores llaman a las funciones de Unicode por usted, puede utilizar FindFirst y sus colegas. Para Delphi 2007 y versiones anteriores (ANSI), deberá llamar directamente al FindFirstFile/FindNextFile/FindClose desde Windows.pas. Para obtener más información, consulte la sección Naming a file de la plataforma SDK.

Tenga en cuenta que el uso de \\?\ deshabilita varios bits de procesamiento de ruta, así que asegúrese de que sea una ruta totalmente calificada sin ningún '.' o '' 'entradas. Puede usar el mismo truco para abrir secuencias de archivos, cambiar el nombre o copiar archivos con rutas más largas.

El shell (Explorer) no es compatible con esto, por lo que aún debe limitarlos a MAX_PATH caracteres como SHFileOperation (para eliminar a la papelera de reciclaje) o ShellExecute. En muchos casos puede evitar el problema al pasar los nombres DOS 8.3 en lugar de los largos. TSearchRec de FindFirst no expone los nombres cortos, pero la estructura TWin32FindData de FindFirstFile funciona como cAlternateFileName.

0

Cambiar el directorio actual (ChDir) a la más profunda a conocer, y luego pasar una ruta relativa aFindFirst o FindFirstFile.

Ningún componente de ruta en ese nombre de archivo es más largo que los caracteres MAX_PATH, por lo que debería poder acceder a los directorios paso a paso.

Tenga en cuenta que los programas multiproceso pueden ser sensibles a los cambios en el directorio actual, ya que un proceso tiene solo un directorio actual compartido por todos los hilos.

Cuestiones relacionadas