Некоторые люди заметили, что NTFS автоматически сортирует имена файлов, но делает это способом, отличным от используемого Проводником. Почему?
Для иллюстрации я создал файлы с такими именами:
Имя | Кодовая точка | Описание |
---|---|---|
a | U+0061 | Latin small letter A |
b | U+0062 | Latin small letter B |
× | U+00D7 | Multiplication sign |
å | U+00E5 | Latin small letter A with ring above |
ø | U+00F8 | Latin small letter O with stroke |
А вот порядок сортировки в различных ситуациях - на моей машине (позже мы увидим, почему машина имеет значение):
Простая команда "dir" | ||
---|---|---|
a | U+0061 | Latin small letter A |
b | U+0062 | Latin small letter B |
å | U+00E5 | Latin small letter A with ring above |
× | U+00D7 | Multiplication sign |
ø | U+00F8 | Latin small letter O with stroke |
"dir /on" | ||
× | U+00D7 | Multiplication sign |
a | U+0061 | Latin small letter A |
å | U+00E5 | Latin small letter A with ring above |
b | U+0062 | Latin small letter B |
ø | U+00F8 | Latin small letter O with stroke |
Проводник сортировкой по имени | ||
× | U+00D7 | Multiplication sign |
a | U+0061 | Latin small letter A |
å | U+00E5 | Latin small letter A with ring above |
b | U+0062 | Latin small letter B |
ø | U+00F8 | Latin small letter O with stroke |
Во-первых, заметьте, что Проводник и команда "dir /on" используют одинаковый алфавитный порядок (но как только вы включаете в рассмотрение цифры - всё меняется). Это не совпадение. Потому что они оба используют алгоритм сортировки слов локали по-умолчанию.
Почему порядок сортировки у NTFS отличается?
Потому что сортировка NTFS - это двоичная raw-сортировка. Почему так? Потому что она преследует иные цели.
Вывод команды "dir /on" и Проводника предназначены для людей. Когда вы сортируете для людей, вам нужно принять во внимание их локаль. Если бы мой компьютер был бы в Швеции, то Проводник и команда "dir /on" сортировали бы файлы в ином порядке:
× | U+00D7 | Multiplication sign |
a | U+0061 | Latin small letter A |
b | U+0062 | Latin small letter B |
å | U+00E5 | Latin small letter A with ring above |
ø | U+00F8 | Latin small letter O with stroke |
Если вам интересно - вы можете спросить шведов, почему это правильный порядок для них (вот ещё пример для турецкого языка). Смысл в том, что каждые локальные установки имеют свои правила сортировки.
Raw-сортировка NTFS, с другой стороны, не создавалась для людей. Как мы видели выше, сортировка для людей приводит к различным результатам, в зависимости от того, кто нас просит. Но на диске существует всего одно правило сортировки. NTFS нужно применить согласованный и единый способ упорядочивания файлов, чтобы она могла найти файл вне зависимости от того, кто её попросил.
Чтобы поддерживать эту согласованность, NTFS использует raw-сортировку, которая не зависит от таких изменчивых состояний окружения как локаль текущего пользователя. Потому что NTFS необходимо зафиксировать порядок сортировки и всегда придерживаться его в дальнейшем. Как указал ранее Майкл Каплан, NTFS сохраняет таблицу приведения регистра во время форматирования диска и продолжает использовать эту таблицу, даже если правила изменения регистра в ОС потом изменятся. Как только строка переводится в верхний регистр, она должна быть отсортирована. Поскольку это не для людей, то нет нужды реализовывать сложные правила с вторичными и третьичными ключами, взаимодействие между буквами-цифрами и пунктуацией - и все подобные вещи, которые и делают сортировку сложной. Эта сортировка просто сравнивает значения кодовых точек и также известна как последовательная (ordinal) сортировка.
В итоге, поэтому, Проводник сортирует элементы так, что вы (человек) легко сможете их найти. NTFS сортирует элементы так, что она (компьютер) сможет легко их найти. Если вы пишете программу и вы хотите, чтобы результат вывода каталога был отсортирован - так сортируйте его сами, основываясь на своих критериях.
Просто не надо называть это сортировкой. Типа по умолчанию файловая система выдаёт список файлов в произвольном порядке, который может меняться от типа и версии файловой системы. Если хотите определённых порядок - заказывайте сортировку или не чирикайте. :)
ОтветитьУдалитьТогда бы и вопросов не было.
Кстати, испокон веков, сами подходил к вопросу именно так. Писал программы предполагая, что функции перечисления могут возвращать файлы в произвольном порядке и никогда не имел проблем. :)
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;
И сортировка будет как в explorer'е