0 delphi
我正在尝试扫描一个目录,但我无法通过文件名排序.
例如,如果我在文件夹中有这些文件名:
- 文件1
- 文件2
- 文件3
- FILE4
- File5
- File6
- File7
- File8
- File9
- File10
- FILE11
- File12
- File13
- FILE14
- File15
- File16
- File17
- File18
- File19
- File20
- File21
- File22
如果我使用这样的东西:
var
SL: TStringList;
SR: TSearchRec;
begin
SL := TStringList.Create;
try
if FindFirst(Path + '*.*', faAnyFile and not faDirectory and not faHidden, SR) = 0 then
repeat
SL.Add(Path + SR.Name)
until FindNext(SR) <> 0;
FindClose(SR);
// handle the filenames..
finally
SL.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
结果将是:
- File10
- FILE11
- File12
- File13
- FILE14
- File15
- File16
- File17
- File18
- File19
- 文件2
- File20
- File21
- File22
- 文件3
- FILE4
- File5
- File6
- File7
- File8
- File9
它应该按Filename排序(正如我在第一个文件名列表示例中所写的那样).
我敢打赌,这很简单,但我看不清楚,我需要做些什么才能对此进行排序?
谢谢.
您首先假设文件名存在某种固有的"顺序".没有.您似乎希望按字母顺序对文件名进行排序,名称的数字部分按数字顺序排序.我不确定你想要用标点符号和其他字符做什么.
文件枚举函数不定义将返回名称的任何顺序.它们以基础文件系统决定提供它们的任何顺序返回.获取文件名的排序列表有两个步骤.你已经在做第一个了:
收集列表中的文件名以进行后处理.
按照您想要的顺序排列名称.如果简单的"asciibetical"不是您想要的,那么您可以编写自定义排序函数并将其传递给TStringList.CustomSort.
例如,如果您希望它们的顺序与Windows XP中Windows资源管理器中的文件名相同,则可以使用StrCmpLogicalWAPI函数.从比较函数中调用,如下所示:
function LogicalCompare(List: TStringList; Index1, Index2: Integer): Integer;
begin
Result := StrCmpLogicalW(PWideChar(List[Index1]), PWideChar(List[Index2]));
end;
SL.CustomSort(LogicalCompare);
Run Code Online (Sandbox Code Playgroud)
如果你有比Delphi 2007更早的东西,你需要做一些关于将字符串转换为宽字符的事情,至少在排序阶段是这样.