列出目录中的文件名并进行排序?

0 delphi

可能重复:
如何在Windows资源管理器中获取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排序(正如我在第一个文件名列表示例中所写的那样).

我敢打赌,这很简单,但我看不清楚,我需要做些什么才能对此进行排序?

谢谢.

Rob*_*edy 7

您首先假设文件名存在某种固有的"顺序".没有.您似乎希望按字母顺序对文件名进行排序,名称的数字部分按数字顺序排序.我不确定你想要用标点符号和其他字符做什么.

文件枚举函数不定义将返回名称的任何顺序.它们以基础文件系统决定提供它们的任何顺序返回.获取文件名的排序列表有两个步骤.你已经在做第一个了:

  1. 收集列表中的文件名以进行后处理.

  2. 按照您想要的顺序排列名称.如果简单的"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更早的东西,你需要做一些关于将字符串转换为宽字符的事情,至少在排序阶段是这样.