我曾认为FindFirst是按字母顺序查找文件的,但最近我发现,虽然大多数情况下确实如此,但也有一些文件没有按字母顺序排列。
if FindFirst( AProgramPath, faAnyFile, ASearchRec ) = 0 then
repeat
AFilename := ASearchRec.name;
until FindNext( ASearchRec ) <> 0;
FindClose( ASearchRec );在包含大约300个文本文件的特定文件夹中,除了大约8-10个文件之外,所有的文件都会按正确的字母顺序返回。
如果findfirst没有按字母顺序返回文件,有没有一种方法可以用来按字母顺序对文件夹内容进行排序,以便findfirst按字母顺序返回文件?
致以敬意,
帐单
发布于 2009-10-20 16:24:42
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;发布于 2009-10-21 00:09:29
不是的。请参阅documentation
FindFirstFile函数打开一个搜索句柄并返回有关文件系统找到的名称与指定模式匹配的第一个文件的信息。当给定相同的文件名字符串模式时,这可能是也可能不是目录列表应用程序(如dir命令)中出现的第一个文件或目录。这是因为FindFirstFile不会对搜索结果进行排序。(已添加强调)
发布于 2009-10-20 16:26:23
FindFirstFile和FindNextFile按照文件在目录中的出现顺序返回文件。在NTFS系统上,这大致是按字母顺序排列的。对于像FAT32这样的东西,顺序是相当不可预测的(只要没有文件被删除,它就是创建的顺序,但是当一个文件被删除时,您在该目录中创建的下一个文件将重用被删除的文件留下的槽)。对于某些远程文件系统,顺序可能更难预测。
对于至少几个文件系统(例如FAT/FAT32),可以对磁盘上的项进行排序。在DOS时代,这样做的实用程序相当普遍,但在目前的系统中,它们大多已不再受欢迎,因为Windows资源管理器(以及类似工具)主要对文件进行排序,而不仅仅是按照FindFirstFile/FindNextFile提供的顺序显示它们。
国际海事组织,你可能应该认真考虑做同样的事情。对磁盘上的数据进行排序在DOS下工作得很好,因为大部分时间后台都没有发生太多事情,所以如果你对一个目录进行排序,它会保持排序状态,至少在一段时间内是这样。现在,典型的Windows box在启动时会运行20+进程,所以即使您对目录进行排序,也不能指望它会在任何时间内保持排序状态。
https://stackoverflow.com/questions/1595727
复制相似问题