2009-01-04 16 views
13

Czy ktoś wie, jakie ustawienia kultury Win32 używa w przypadku nazw plików niewrażliwych na wielkość liter?Porównywanie nazw plików Win32

Czy jest to coś, co różni się w zależności od kultury użytkownika, czy też zasady dotyczące wirusów, które Win32 stosuje do niezmienników kultury?

Odpowiedz

6

Przybliżona odpowiedź to Comparing Unicode file names the right way.

Zasadniczo zaleca się duże litery, oba ciągi (stosując CharUpper, CharUpperBuff lub LCMapString), a następnie porównać podstawie porównania binarnego (tj memcmp lub wmemcmp nie compareString z niezmiennym regionu). System plików nie wykonuje normalizacji Unicode, a reguły sprawy nie zależą od ustawień regionalnych.

Istnieją niefortunne, niejednoznaczne przypadki, gdy mamy do czynienia z postaciami, których zasady dotyczące obudowy zmieniły się w różnych wersjach Unicode, ale są tak dobre, jak to tylko możliwe.

6

Comparing file names in native code i Don't compare filenames to kilka dobrych blogów na ten temat. Pierwszy ma kod C/C++ dla OrdinalIgnoreCaseCompareStrings, a drugi mówi ci, jak to nie zawsze działa dla nazw plików i co zrobić, aby to złagodzić.

Następnie są problemy z Unicode. Te nowe algorytmy porównywania ciągów znaków OrdinalIgnoreCase są świetne dla lokalnego dysku NTFS, ale mogą nie dać prawidłowej odpowiedzi na dysku FAT lub udziale sieciowym.

Jaka jest odpowiedź? Kiedy to możliwe, niech system plików powie ci. CreateFile może powiedzieć, czy istnieje podana nazwa pliku. Po prostu wybierz właściwą dyspozycję stworzenia. Jeśli chcesz porównać do uchwytów, możesz często użyć GetFileInformationByHandle; spójrz na dwVolumeSerialNumber/nFileIndexHigh/nFileIndexLow.

4

Jeśli używasz .NET, oficjalne zalecenie od Microsoft jest użycie StringComparison.OrdinalIgnoreCase dla porównania i ToUpperInvariant do normalizacji (być później porównano za pomocą Ordinal porównania). Dotyczy to również kluczy rejestru i wartości, zmiennych środowiskowych itp.

Aby uzyskać więcej informacji, zobacz artykuł New Recommendations for Using Strings in Microsoft .NET 2.0.

Należy pamiętać, że chociaż jest niezawodny na NTFS, może się nie powieść na przykład w przypadku udziałów sieciowych. Zobacz @ SteveSteiner's odpowiedzi i linki w swoim poście na rozwiązania.

Powiązane problemy