Каково ожидаемое поведение по умолчанию, когда Windows встречает два файла с одним и тем же именем, но разной заглавной буквой в разделе NTFS?

16

Легко записать два файла в раздел NTFS из Linux, и оба эти файла содержат одинаковые буквы, но с разным регистром, например, some_file.txt и Some_File.txt. Linux отличает их.

Как Windows справляется с этим?

trusktr
источник
1
Лично из-за всех факторов, я бы сказал, что это вызывает неопределенное поведение. Если Windows не определяет поведение в этом случае, то по определению оно не определено. Если Windows делает определить поведение, я бы все - таки относиться к ней как к неопределенному поведению, потому что я серьезно сомневаюсь , что все программы справиться с этим постоянно.
jpfx1342

Ответы:

20

Лица MS-DOS, WOW и Win32 вернут первый соответствующий файл. Для некоторых приложений и интерфейсов API, к регистру нечувствительность является соблюдение (например, MS-DOS просто не может справиться с этим). Индивидуальность POSIX будет различаться и будет чувствительна к регистру по умолчанию (например, если у вас установлены инструменты UNIX). Родная командная строка Windows NT будет отображать и то, и другое, но в зависимости от настроек (ObCaseInsensitive) и того, какие API-интерфейсы используют инструменты, доступ только к первому из найденных.

См. Статью Microsoft Technet. Имена файлов чувствительны к регистру в томах NTFS (KB100625), а также подробное обсуждение тонкостей чувствительности к регистру в различных подсистемах NT: понимание чувствительности к регистру в Windows: obcaseinsensitive, FILE_CASE_SENSITIVE_SEARCH

В частности, значение ObCaseInsensitive контролирует чувствительность к регистру всего NT Object Manager:

HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\ dword:ObCaseInsensitive
  • При значении 0 менеджер объектов работает в режиме с учетом регистра.
  • При значении 1 менеджер объектов запускается в режиме без учета регистра.
  • Если не указано, NT 5.1 (Windows XP) и более поздние выпуски по умолчанию работают в нечувствительном к регистру режиме.
  • obcaseinsensitive не имеет значения в NT 5.0 (Windows 2000) и предыдущих версиях NT, которые всегда работают в чувствительном к регистру режиме.

На этом этапе Cygwin должен подобрать базовые / эффективные настройки чувствительности к регистру.

Связанный вопрос SuperUser Как настроить чувствительность к регистру имен папок в Windows 7? и в статье TechNet « Настройка чувствительности к регистру для имен файлов и папок» содержится дополнительная информация о включении полной чувствительности к регистру для файлов и папок в NT, если вам потребуется регулярно обрабатывать эту ситуацию.

Дополнительные ресурсы по инструментам с учетом регистра / доступ к томам NTFS / NFS:

Maxx Daymon
источник
Если существуют два файла, One.txt и ONE.txt, какой файл будет «совпадать первым», если я предоставлю one.txt? Существуют ли правила, по которым будет «первый соответствующий файл»?
trusktr
1
Вероятно, это основано на внутреннем порядке файлов в каталоге. Я попробую завтра, если хочешь знать точно.
Даниэль Б
2
Какой из них является первым, определяется исключительно порядком их появления в каталоге. Это НЕ обязательно порядок, в котором они созданы. И это может измениться, если либо файл изменен, либо директория обновлена. (Chkdsk, Defrag, удаление, копирование, перемещение других файлов в этой папке могут все изменить порядок.)
Тонни
1
@trusktr Ну, видимо, есть какой-то порядок, в конце концов. Я создал несколько наборов файлов (используя NTFS-3G), каждый из которых имеет разную заглавную букву и в разных порядках. Windows (или, точнее, Блокнот) всегда выбирает файл, начинающийся с заглавной буквы, независимо от порядка создания. moreпросто возвращает знак вопроса, хотя.
Даниэль Б,
1
@trusktr Это будет следовать порядку записей INDX дерева B + каталога. Это дерево отсортировано по проекту, но может немного отличаться в зависимости от драйвера NTFS. Это будет (OnCaseInsensitive = 0, Win32 / DOS / WOW API) первое совпадение при обходе (отсортированного) дерева с указанным именем и именем записи INDX. NTFS использует порядковые сравнения, поэтому верхний регистр должен всегда находиться перед строчными. (AZ = 0041-005A, az = 0061-007A)
Maxx Daymon
2

Это не так. Он считает, что различия в регистре, но в остальном одинаковые имена совпадают с одним файлом.

Вы можете проверить это, создав файл в нижнем регистре, а затем создав другой файл только с одной буквой в верхнем регистре, и он будет жаловаться.

Casey
источник
У меня нет среды, чтобы проверить это прямо сейчас. У меня только OS X на данный момент. Не могли бы вы описать, что происходит? Моим первым предположением будет то, что Windows выбирает (возможно, непреднамеренно) какой файл для чтения / записи по некоторым критериям (например, лексический порядок с приоритетом в нижнем регистре или наоборот). Или это не позволяет манипулировать каким-либо файлом?
trusktr
1
@trusktr Система жалуется, что файл уже существует, в зависимости от используемого приложения или кода, он будет игнорироваться и просто перезаписывает существующий файл. Как прокомментировал jpfx1342 , эту проблему следует рассматривать как неопределенное поведение.
Кейси