2009-10-20 12 views
8

He pensado que FindFirst encontró archivos en orden alfabético, pero recientemente descubrí que, si bien esto es cierto en su mayor parte, algunos archivos no están en orden alfabético.¿Se supone que FindFirst devuelve los archivos encontrados en orden alfabético?

if FindFirst(AProgramPath, faAnyFile, ASearchRec) = 0 then 
repeat 
    AFilename := ASearchRec.name; 
until FindNext(ASearchRec) <> 0; 
FindClose(ASearchRec); 

en una carpeta específica aquí con alrededor de 300 archivos de texto todos menos aproximadamente 8-10 de los archivos se devuelven en el orden alfabético.

si findfirst no devuelve los archivos en orden alfabético ¿hay algún método que pueda usarse para ordenar los contenidos de las carpetas en orden alfabético de manera que findfirst devuelva los archivos en orden alfabético?

Saludos,

Bill

Respuesta

11

La función FindFirst no hace la clasificación de los resultados de búsqueda, pero se puede ordenar los archivos usando un TStringList.

Procedure GetOrderFiles(); 
var 
ListFiles : TStringList; 
result : integer; 
ASearchRec: TSearchRec; 
begin 
ListFiles   := TStringList.Create; 
try 
    ListFiles.sorted := True; 
    result  := findFirst(AProgramPath,faAnyFile,ASearchRec); 
    try 
    while result = 0 do 
    begin 
     if (ASearchRec.name <> '.') and (ASearchRec.name <> '..') then 
     ListFiles.add(ASearchRec.name); 
     result:=FindNext(ASearchRec); 
    end; 
    finally 
    FindClose(ASearchRec); 
    end; 

    //process your files 

    //.... 
finally 
    ListFiles.free; 
end; 
end; 
10

Nº Ver el documentation:

La función FindFirstFile abre un identificador de búsqueda y devuelve información sobre el primer archivo que se encuentra el sistema de archivos con un nombre que coincide con el patrón especificado. Este puede o no ser el primer archivo o directorio que aparece en una aplicación de listado de directorios (como el comando dir) cuando se le da el mismo patrón de cadena de nombre de archivo. Esto se debe a que FindFirstFile no ordena los resultados de búsqueda. (énfasis añadido)

5

FindFirstFile y FindNextFile devuelven los archivos en el orden en que aparecen en el directorio. En un sistema NTFS, eso es aproximadamente orden alfabético. Para algo como FAT32, el orden es bastante impredecible (siempre que no se elimine ningún archivo, es el orden de creación, pero cuando se elimina un archivo, el siguiente archivo que cree en ese directorio volverá a utilizar el espacio dejado por el eliminado archivo). Para algunos sistemas de archivos remotos, es probable que el orden sea aún menos predecible.

Es posible para ordenar los elementos en el disco para al menos algunos sistemas de archivos (por ejemplo, FAT/FAT32). En los días de DOS, las utilidades para hacerlo eran bastante comunes, pero en los sistemas actuales en su mayoría cayeron en desgracia porque el Explorador de Windows (y tal) en su mayoría ordena los archivos en lugar de simplemente mostrarlos en el orden proporcionado por FindFirstFile/FindNextFile.

IMO, probablemente deberías pensar muy duro sobre hacer lo mismo. La ordenación de los datos en el disco funcionó bastante bien en DOS, porque no pasaba mucho en el fondo la mayor parte del tiempo, por lo que si ordenaba un directorio, permanecía ordenado, al menos por un tiempo. Hoy en día, una caja típica de Windows tiene más de 20 procesos ejecutándose al inicio, por lo que incluso si ordena el directorio, no puede depender de que permanezca ordenado por un período de tiempo prolongado.

+0

Gracias ... sí, estaba pensando en los días de DOS ... buen consejo. el enfoque de lista de cadenas es interesante. –

Cuestiones relacionadas