17

(少なくともNTFSでは)Windowsのファイルシステムは大文字と小文字を区別しないため、次のように比較String fileAしたいと思いString fileBます。

fileA.Equals(fileB, StringComparison.CurrentCultureIgnoreCase)

問題は、どのカルチャを使用する必要があるかということです。デフォルトの現在の (ui?) カルチャで十分ですか? この目的のための BCL メソッドが見つからないようです。

4

6 に答える 6

27

.NET Framework で文字列を使用するためのベスト プラクティスStringComparison.OrdinalIgnoreCaseに従って、を使用する必要があります。

ファイル システム、レジストリ キーと値、および環境変数の文字列の動作は、StringComparison.OrdinalIgnoreCase で最もよく表されます。

文字列の照合にカルチャを使用すると、たとえば「häl.gif」と「hal.gif」という名前が一致すると見なされる状況に陥る可能性があります。

于 2009-11-18T15:27:58.843 に答える
3

これを確実に行うことはできません。

はい、ファイル システムの大文字と小文字の変換では、大文字と小文字が区別されません。

ただし、大文字と小文字の変換テーブルはファイル システム自体 (NTFS の場合) に格納され、バージョン間で変更されます (たとえば、Vista の大文字と小文字の変換テーブルは Unicode 5 レベルになったため、Vista NTFS と XP NTFS では大文字と小文字の変換規則が異なります。 )。

重要なのは、現在の OS ではなく、ファイル システムをフォーマットした OS です。

次に、他のファイルシステムであらゆる種類の問題に遭遇する可能性があります (Mac OS は何らかの種類の Unicode 正規化 (標準のものではない) を行います)、Linux は何もしませんが、Samba (Windows ファイル共有プロトコルの実装) は行います。Windows以外のテーブルもあります。

Linux や Mac OS で共有されているネットワーク ディスクにレターをマップするとどうなるでしょうか。

一般に、ファイル名を比較しようとすべきではありません。そこにあるかどうか知りたい場合は、アクセスしてみてください。

于 2009-11-26T08:22:02.930 に答える
2

マーカス、

別の StackOverflow の質問に対する回答を参照してください。これは非常によく似ています: Win32 File Name Comparisonでは、 http://www.siao2.com/2005/10/17/481600.aspxについて言及されています。

同じ質問に対する別の回答のリンクをたどってさらに掘り下げたところ、次の MSDN 記事http://msdn.microsoft.com/en-us/library/ms973919.aspxに出会いました。一般的には一読の価値がありますが、ファイル名の比較に関しては、StringComparison.OrdinalIgnoreCase を使用することをお勧めします。記事の表 1 を参照してください。この表には、処理されるデータ型の 1 つとしてファイル パスが含まれているか、次の引用が含まれています。

そのため、ファイル名、Cookie、または å の組み合わせのようなものが現れる可能性があるその他のものを解釈する場合、序数比較は依然として最も透過的で適切な動作を提供します。

これが役に立てば幸いです、ボアズ

于 2009-11-18T21:59:16.253 に答える
0

InvariantCulture を使用できます (http://msdn.microsoft.com/en-us/library/4c5zdc6a.aspx )。

あなたの例では:


FileA.Equals(FileB,StringComparison.InvariantCultureIgnoreCase )
于 2009-11-18T15:32:52.143 に答える
0

多分あなたはこれを試すことができます: http://msdn.microsoft.com/en-us/library/zkcaxw5y.aspx

于 2009-11-18T15:26:28.503 に答える
-1

私はこれを試しました。

Path.GetFullPath(path1).Equals(Path.GetFullPath(path2))
于 2013-08-07T07:31:26.337 に答える