Best Practices for Using Strings in the .NET Frameworkには、大文字と小文字を区別しないファイルパスにStringComparison OrdinalIgnoreCase
を使用することをお勧めします。彼らのファイル名が同じではありませんToUpperInvariant() - 推奨のMSDNが間違っていますか?
é.txt
é.txt
、二つ目はe
から構成されており、私は同じディレクトリに2つのファイルを作成することができますので、私は、それに同意することができます
を(のは、ステートメントA.それを呼びましょう)修飾子なので、実際には2つの文字があります。
不変の文化比較があって効果的でない場合、NTFSはこれらのファイルを許可しません。これは、同じ記事で説明するように、不変の文化a + ̊ = å
しかしString.ToUpperInvariant()
上の記事であっ異なるオススメです:あなたが名前付きパイプファイル名などのオペレーティングシステム識別子、の小文字または大文字のバージョンが必要な場合(ステートメントB.)
は、またはレジストリキーを使用するには、ToLowerInvariantメソッドまたはToUpperInvariantメソッドを使用します。
重複を検出するためにファイルパスコレクション(実際はHashSet
)を作成する必要があります。したがって、マップを作成するときに文Bに従うと、上記のファイル名é.txt
とé.txt
が1つとみなされるため、誤認で終わることがあります。 MSDNで見つかったステートメントBが誤解を招くということを正しく理解していますか?または私は何かを逃している?
私はライブラリーを構築しようとしています。ライブラリーは、最初から知られていないバグがなくても構いませんので、これを無視したくありません。
更新:ToLowerInvariant()実際に使用することはできません。
書Bは、1つのより多くの問題を持っているようです。理由(私はベストプラクティスの記事を引用):DO: Use ToUpperInvariant rather than ToLowerInvariant when normalizing strings for comparison.
実際の理由:There is a small range of characters that do not roundtrip, and going to lowercase will make these characters unavailable.
(source)あなたが平等のための大文字と小文字を区別せずには文字列を比較したい場合
「オペレーティングシステム識別子の小文字または大文字のバージョン」は、「オペレーティングシステム識別子を小文字または大文字のバージョンに明白にマッピングする」と同じ意味になっています。また、「システムのロケールに関係なく同じ方法で動作する、ユニークでない小文字または大文字のバージョンへのオペレーティングシステム識別子のマッピング」を意味する場合もあります。 –
OTですが、あなたのライブラリが何をしているかを知っている人:NTFSでは、ファイル名に ':'、 '*'や '?'を使うこともできます。それはそれをサポートしていないWindowsだけです。このようなファイルをLinux上のNTFS上に作成するのは簡単です。 –
@ O.R.Mapper - その文を読む良い方法...この文脈では論理的に見えます。一方、ファイル名の記載を省略したり、一意ではない短い注釈を追加することもできます。 – miroxlav