Jakie jest domyślne oczekiwane zachowanie, gdy system Windows napotka dwa pliki o tej samej nazwie, ale różnej wielkości liter na partycji NTFS?

16

Łatwo jest napisać dwa pliki na partycję NTFS z Linuksa i oba te pliki zawierają te same litery, ale z różnymi literami, np. Some_file.txt i Some_File.txt. Linux je rozróżnia.

Jak Windows sobie z tym radzi?

trusktr
źródło
1
Osobiście, ze względu na wszystkie zaangażowane czynniki, powiedziałbym tylko, że powoduje nieokreślone zachowanie. Jeśli system Windows nie zdefiniuje zachowania w tym przypadku, to z definicji jest niezdefiniowane. Jeśli system Windows nie określają zachowanie, chciałbym nadal traktować je jako zachowanie niezdefiniowane, bo wątpię, że wszystkie programy obsługi to konsekwentnie.
jpfx1342

Odpowiedzi:

20

Osobowości MS-DOS, WOW i Win32 zwrócą pierwszy pasujący plik. W przypadku niektórych aplikacji i interfejsów API wymuszana jest rozróżnianie wielkości liter (np. MS-DOS po prostu nie może sobie z tym poradzić). Osobowość POSIX będzie się różnicować i domyślnie rozróżniana jest wielkość liter (na przykład, jeśli masz zainstalowane narzędzia UNIX). Natywny wiersz polecenia systemu Windows NT wyświetli oba, ale w zależności od ustawień (ObCaseInsensitive) i interfejsów API używanych przez narzędzia, uzyskuje dostęp tylko do pierwszego znalezionego.

Zobacz artykuł Microsoft Technet W nazwach plików rozróżniana jest wielkość liter w woluminach NTFS (KB100625), a także szczegółowe omówienie subtelności rozróżniania wielkości liter w różnych podsystemach NT: Zrozumienie rozróżniania wielkości liter w systemie Windows: obcaseinsensitive, FILE_CASE_SENSITIVE_SEARCH

W szczególności wartość ObCaseInsensitive kontroluje rozróżnianie wielkości liter w całym NT Object Manager:

HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\ dword:ObCaseInsensitive
  • Po ustawieniu na 0 menedżer obiektów działa w trybie rozróżniania wielkości liter.
  • Po ustawieniu na 1 menedżer obiektów działa w trybie bez rozróżniania wielkości liter.
  • Gdy nie jest określony, NT 5.1 (Windows XP) i nowsze wersje domyślnie działają w trybie bez rozróżniania wielkości liter.
  • obcaseinsensitive nie ma znaczenia w NT 5.0 (Windows 2000) i wcześniejszych wersjach NT, które zawsze działają w trybie rozróżniania wielkości liter.

W tym momencie Cygwin powinien wybrać podstawowe / skuteczne ustawienia rozróżniania wielkości liter.

Powiązane pytanie SuperUser Jak skonfigurować rozróżnianie wielkości liter w nazwach folderów w systemie Windows 7? i artykuł w witrynie TechNet Konfigurowanie rozróżniania wielkości liter w nazwach plików i folderów zawierają więcej informacji na temat włączania pełnej rozróżniania wielkości liter w plikach i folderach w systemie NT, jeśli trzeba będzie regularnie obsługiwać tę sytuację.

Dodatkowe zasoby dotyczące rozróżniania wielkości liter w narzędziach / dostępie do woluminów NTFS / NFS:

Maxx Daymon
źródło
Jeśli istnieją dwa pliki, One.txt i ONE.txt, który plik „pasuje pierwszy”, jeśli dostarczę plik one.txt? Czy istnieją reguły, według których będzie „pierwszy pasujący plik”?
trusktr
1
Prawdopodobnie jest oparty na wewnętrznej kolejności plików w katalogu. Spróbuję jutro, jeśli chcesz dokładnie wiedzieć.
Daniel B
2
To, który jest pierwszy, zależy wyłącznie od kolejności, w jakiej pojawiają się w katalogu. To niekoniecznie jest kolejność, w jakiej są tworzone. Może się to zmienić, jeśli albo plik zostanie zmodyfikowany, albo directoy zostanie zaktualizowany. (Chkdsk, Defrag, usuwanie, kopiowanie przenoszenia innych plików w tym folderze może wszystko zmienić kolejność.)
Tonny
1
@trusktr Cóż, najwyraźniej w końcu istnieje jakiś porządek. Utworzyłem wiele zestawów plików (przy użyciu NTFS-3G), każdy o różnej wielkości liter i różnych porządkach. System Windows (a dokładniej Notatnik) zawsze wybiera plik, zaczynając od dużej litery, niezależnie od kolejności tworzenia. morepo prostu zwraca znak zapytania.
Daniel B,
1
@trusktr Będzie postępował zgodnie z kolejnością wpisów INDX drzewa B + katalogu. To drzewo jest posortowane według projektu, ale może się nieznacznie różnić w zależności od sterownika NTFS. Będzie to (OnCaseInsensitive = 0, Win32 / DOS / WOW API) pierwsze dopasowanie podczas spaceru po (posortowanym) drzewie o określonej nazwie i nazwie wpisu INDX. NTFS używa porównań porządkowych, dlatego przed małymi zawsze należy zawsze znajdować wielkie litery. (AZ = 0041-005A, az = 0061-007A)
Maxx Daymon
2

Tak nie jest. Bierze pod uwagę różnice w wielkości liter, ale poza tym dokładne te same nazwy są tym samym plikiem.

Możesz to przetestować, tworząc plik małymi literami, a następnie tworząc kolejny z tylko jedną literą na górze, a to narzeka.

Casey
źródło
Nie mam teraz środowiska, żeby to przetestować. W tej chwili mam tylko OS X. Czy możesz opisać, co się stanie? Najpierw sądzę, że Windows wybiera (być może nieumyślnie), który plik do odczytu / zapisu według niektórych kryteriów (np. Kolejność leksykalna z pierwszeństwem małych liter lub odwrotnie). Czy też nie pozwala na manipulowanie żadnym plikiem?
trusktr
1
@trusktr System narzeka, że ​​plik już istnieje, w zależności od zastosowanej aplikacji lub kodu, zostanie on po cichu zignorowany i po prostu zastąpi istniejący plik. Jak skomentował jpfx1342 , ten problem należy traktować jako zachowanie niezdefiniowane.
Casey