Яка очікувана поведінка за замовчуванням, коли Windows стикається з двома файлами з однаковим іменем, але різними написаннями великих літер у розділі NTFS?


16

Дуже легко записати два файли на розділ NTFS з Linux, і обидва ці файли містять однакові букви, але з різними регістрами, наприклад, some_file.txt та Some_File.txt. Linux їх відрізняє.

Як Windows справляється з цим?


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:


Якщо існують два файли, One.txt та ONE.txt, який би файл "відповів першим", якщо я надаю one.txt? Чи є правила, за якими буде "перший файл відповідності"?
trusktr

1
Можливо, це засновано на внутрішньому порядку файлів у каталозі. Я спробую завтра, якщо ви хочете точно знати.
Даніель Б

2
Який з них перший, суто вирішується в порядку, в якому вони відображаються в каталозі. Це НЕ обов’язково порядок їх створення. І він може змінитися, якщо будь-який файл буде змінено або дирекцію оновлено. (Chkdsk, Defrag, видалення, копіювання переміщення інших файлів у цій папці можуть усі змінити порядок.)
Tonny

1
@trusktr Ну, мабуть, там є якийсь порядок. Я створив декілька наборів файлів (використовуючи NTFS-3G), кожен з різною написанням великої літери та в різних порядках. Windows (або, точніше, Notepad) завжди вибирає файл, починаючи з великої літери, незалежно від порядку створення. moreоднак просто повертає знак питання.
Даніель Б

1
@trusktr Він буде виконувати порядок записів INDX дерева B + в каталозі. Це дерево відсортовано за дизайном, але може дещо відрізнятися залежно від драйвера NTFS. Це (OnCaseInsensitive = 0, Win32 / DOS / WOW API) буде першим збігом під час прогулянки по (сортуваному) дереву вказаного імені та імені входу INDX. NTFS використовує порядкові порівняння, тому великі букви повинен завжди перебувати перед малими. (AZ = 0041-005A, az = 0061-007A)
Maxx Daymon

2

Це не так. Він вважає відмінності у регістрі, але в іншому випадку точно однакові імена є одним і тим же файлом.

Ви можете перевірити це, створивши файл у всіх малих літерах, а потім створивши ще один із верхньою літерою, і він скаржиться.


У мене немає середовища, щоб перевірити це зараз. Наразі у мене є OS X. Чи могли б ви описати, що відбувається? Першим моїм припущенням буде те, що Windows вибирає (можливо, ненавмисно), який файл читати / писати за деякими критеріями (наприклад, лексичний порядок, який має верхній регістр із нижнього регістру, або навпаки). Або це не дозволяє будь-яким файлом маніпулювати будь-яким?
trusktr

1
@trusktr Система скаржиться на те, що файл вже існує, залежно від програми або коду, що це буде мовчазно ігноруватися та просто перезаписувати наявний файл. Як коментує jpfx1342 , це питання слід трактувати як невизначене поведінку.
Кейсі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.