大文字と小文字を区別しないファイル名を処理するときに Win32 が使用するカルチャ設定を知っている人はいますか?
これはユーザーのカルチャに基づいて変化するものですか、それとも Win32 が使用する大文字と小文字の規則はカルチャ不変ですか?
大文字と小文字を区別しないファイル名を処理するときに Win32 が使用するカルチャ設定を知っている人はいますか?
これはユーザーのカルチャに基づいて変化するものですか、それとも Win32 が使用する大文字と小文字の規則はカルチャ不変ですか?
おおよその答えは Comparing Unicode file names the right way にあります。
基本的には、両方の文字列を大文字にし ( CharUpper
、CharUpperBuff
、またはをLCMapString
使用)、バイナリ比較 (つまり、不変ロケールの CompareString ではなく、memcmp または wmemcmp) を使用して比較することをお勧めします。ファイル システムは Unicode の正規化を行わず、大文字と小文字の規則はロケール設定に依存しません。
大文字と小文字の規則が異なるバージョンの Unicode 間で変更された文字を処理する場合、あいまいなケースが残念ながらありますが、できることはほぼ同じです。
Comparing file names in native codeとDon't compare filenamesは、このトピックに関する優れたブログ投稿です。1 つ目は OrdinalIgnoreCaseCompareStrings の C/C++ コードで、2 つ目はファイル名に対して常に機能するとは限らないことと、それを軽減するために何をすべきかを示しています。
次に、ユニコードの問題があります。これらの新しい
OrdinalIgnoreCase
文字列比較アルゴリズムは、ローカルの NTFS ドライブには適していますが、FAT ドライブやネットワーク共有では正しい答えが得られない可能性があります。それで、答えは何ですか?可能であれば、ファイル システムに通知させてください。
CreateFile
指定されたファイル名が存在するかどうかを知ることができます。正しい創造性を選ぶだけです。ハンドルと比較する必要がある場合は、多くの場合GetFileInformationByHandle
;を使用できます。dwVolumeSerialNumber
/nFileIndexHigh
/を見てくださいnFileIndexLow
。
.NETを使用している場合、Microsoft からの公式の推奨事項はStringComparison.OrdinalIgnoreCase
、比較およびToUpperInvariant
正規化に使用することです (後で比較を使用してOrdinal
比較します)。これは、レジストリのキーと値、環境変数などにも当てはまります。
詳細については、Microsoft .NET 2.0での文字列の使用に関する新しい推奨事項を参照してください。
NTFS では信頼できますが、ネットワーク共有などでは失敗する可能性があることに注意してください。解決策については、@SteveSteiner の回答と彼の投稿のリンクを参照してください。