我认为FindFirst按字母顺序找到了文件,但最近我发现虽然大多数情况下都是如此,但是有些文件不按字母顺序排列。
if FindFirst( AProgramPath, faAnyFile, ASearchRec ) = 0 then
repeat
AFilename := ASearchRec.name;
until FindNext( ASearchRec ) <> 0;
FindClose( ASearchRec );
在此处的特定文件夹中包含大约300个文本文件,但大约8-10个文件以正确的字母顺序返回。
如果findfirst没有按字母顺序返回文件,是否有一种方法可用于按字母顺序对文件夹内容进行排序,以便findfirst按字母顺序返回文件?
此致
比尔
答案 0 :(得分:11)
FindFirst函数不对搜索结果进行排序,但您可以使用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;
答案 1 :(得分:10)
没有。请参阅documentation:
FindFirstFile函数打开一个搜索句柄,并返回有关文件系统找到的第一个文件的信息,其名称与指定的模式匹配。当给定相同的文件名字符串模式时,这可能是也可能不是目录列表应用程序(例如dir命令)中出现的第一个文件或目录。 这是因为FindFirstFile没有对搜索结果进行排序。 (强调添加)
答案 2 :(得分:5)
FindFirstFile和FindNextFile以它们在目录中出现的顺序返回文件。在NTFS系统上,这大致按字母顺序排列。对于像FAT32这样的东西,订单是相当不可预测的(只要没有文件被删除,它就是创建的顺序,但是当一个文件被删除时,你在该目录中创建的下一个文件将重新使用被删除的留下的插槽文件)。对于某些远程文件系统,订单可能更难以预测。
可能对磁盘上的项目进行至少几个文件系统(例如FAT / FAT32)的排序。在DOS时代,这样做的实用程序相当普遍,但在当前的系统中,它们大多不受欢迎,因为Windows资源管理器(等等)主要是对文件进行排序,而不是仅按FindFirstFile / FindNextFile提供的顺序显示它们。
IMO,你应该认真考虑做同样的事情。对磁盘上的数据进行排序在DOS下工作得很好,因为在大多数情况下后台中没有发生太多事情,所以如果你对目录进行了排序,它至少会暂时排序。如今,典型的Windows机箱在启动时运行了20多个进程,因此即使您对目录进行排序,也不能依赖它在任何时间内保持排序。