18

大文字と小文字を区別しないファイル名を処理するときに Win32 が使用するカルチャ設定を知っている人はいますか?

これはユーザーのカルチャに基づいて変化するものですか、それとも Win32 が使用する大文字と小文字の規則はカルチャ不変ですか?

4

4 に答える 4

8

おおよその答えは Comparing Unicode file names the right way にあります。

基本的には、両方の文字列を大文字にし ( CharUpperCharUpperBuff、またはをLCMapString使用)、バイナリ比較 (つまり、不変ロケールの CompareString ではなく、memcmp または wmemcmp) を使用して比較することをお勧めします。ファイル システムは Unicode の正規化を行わず、大文字と小文字の規則はロケール設定に依存しません。

大文字と小文字の規則が異なるバージョンの Unicode 間で変更された文字を処理する場合、あいまいなケースが残念ながらありますが、できることはほぼ同じです。

于 2009-01-04T06:30:30.497 に答える
6

Comparing file names in native codeDon't compare filenamesは、このトピックに関する優れたブログ投稿です。1 つ目は OrdinalIgnoreCaseCompareStrings の C/C++ コードで、2 つ目はファイル名に対して常に機能するとは限らないことと、それを軽減するために何をすべきかを示しています。

次に、ユニコードの問題があります。これらの新しいOrdinalIgnoreCase文字列比較アルゴリズムは、ローカルの NTFS ドライブには適していますが、FAT ドライブやネットワーク共有では正しい答えが得られない可能性があります。

それで、答えは何ですか?可能であれば、ファイル システムに通知させてください。CreateFile指定されたファイル名が存在するかどうかを知ることができます。正しい創造性を選ぶだけです。ハンドルと比較する必要がある場合は、多くの場合GetFileInformationByHandle;を使用できます。dwVolumeSerialNumber/ nFileIndexHigh/を見てくださいnFileIndexLow

于 2009-01-04T07:14:49.317 に答える
4

.NETを使用している場合、Microsoft からの公式の推奨事項はStringComparison.OrdinalIgnoreCase、比較およびToUpperInvariant正規化に使用することです (後で比較を使用してOrdinal比較します)。これは、レジストリのキーと値、環境変数などにも当てはまります。

詳細については、Microsoft .NET 2.0での文字列の使用に関する新しい推奨事項を参照してください。

NTFS では信頼できますが、ネットワーク共有などでは失敗する可能性があることに注意してください。解決策については、@SteveSteiner の回答と彼の投稿のリンクを参照してください。

于 2014-12-21T12:40:56.957 に答える