Как получить порядок сортировки в Delphi, как в Проводнике Windows?

уплотнения:

  1. терминология, которую я был поиск кажется " естественным род."
  2. для действий в операционных системах:

    • для Windows (версия >= XP), Проводник Windows использует естественный род.
    • для терминалов Linux: используйте "ls-v" вместо простого "ls", чтобы получить естественный род.
  3. для программирования в Delphi используйте STRCMPLOGICALW Windows API для получения естественной сортировки.

  4. для программирования в Delphi & Kylix & Lazarus используйте функции ручной работы, чтобы получить натуральный сорт:

==========================

следующие имена файлов будут упорядочены в Проводнике Windows, как показано ниже:

test_1_test.txt

test_2_test.txt

test_11_test.txt

test_12_test.txt

test_21_test.txt

test_22_test.txt

Если, например, я помещаю их в экземпляр TStringList и вызываю сортировку, порядок сортировки выглядит так ниже:

test_1_test.txt

test_11_test.txt

test_12_test.txt

test_2_test.txt

test_21_test.txt

test_22_test.txt

и для записи вышеуказанные имена файлов будут упорядочены в терминале rxvt Cygwin или xterm терминала дистрибутивов Linux, таких как CentOS, как показано на рисунке ниже:

test_11_test.txt

test_12_test.txt

test_1_test.txt

test_21_test.txt

test_22_test.txt

test_2_test.txt

не могли бы вы прокомментировать, как понять эту разницу в поведении сортировки? Кроме того, можно ли получить тот же порядок, что и в Проводнике Windows? Любое предложение приветствуется!

PS: моя локаль Windows установлена на китайский, но я бы подумал, что то же самое для английского языка.

2 ответов


StrCmpLogicalW способен обрабатывать числа, Другой альтернативой является функции comparestring


спасибо Андерсу-ответ StrCmpLogicalW; я не нашел его объявление в источниках Delphi 2009, поэтому я объявил его сам в тесте ниже:

type
  TMyStringList = class(TStringList)
  protected
    function CompareStrings(const S1, S2: string): Integer; override;
  end;

function StrCmpLogicalW(P1, P2: PWideChar): Integer;  stdcall; external 'Shlwapi.dll';

function TMyStringList.CompareStrings(const S1, S2: string): Integer;
begin
  Result:= StrCmpLogicalW(PChar(S1), PChar(S2));
end;

procedure TForm11.Button2Click(Sender: TObject);
var
  SL: TMyStringList;

begin
  SL:= TMyStringList.Create;
  try
    SL.Add('test_1_test.txt');
    SL.Add('test_11_test.txt');
    SL.Add('test_12_test.txt');
    SL.Add('test_2_test.txt');
    SL.Add('test_21_test.txt');
    SL.Add('test_22_test.txt');
    SL.Sort;
    Memo1.Lines:= SL;
  finally
    SL.Free;
  end;
end;