大文字と小文字の規則が異なる複数のファイル システムが存在する可能性があることに注意してください。たとえば、ルート ファイル システムでは大文字と小文字が区別される場合がありますが、大文字と小文字が区別されないファイル システム (FAT ファイル システムを含む USB スティックなど) をどこかにマウントすることができます。そのため、そのようなチェックを行う場合は、アクセスしようとしているディレクトリで行うようにしてください。
また、ユーザーが大文字と小文字を区別するファイル システムから大文字と小文字を区別しないファイル システムにデータをコピーするとどうなるでしょうか。大文字と小文字のみが異なるファイルがある場合、一方が他方を上書きし、データが失われます。逆方向にコピーする場合、たとえば、ファイル A にファイル "b" への参照が含まれているが、ファイルの名前が実際には "B" である場合など、問題が発生する可能性があります。これは、大文字と小文字を区別しない元のファイル システムでは機能しますが、大文字と小文字を区別するシステムでは機能しません。
したがって、可能であれば、ファイル システムで大文字と小文字が区別されるかどうかに依存することは避けることをお勧めします。大文字と小文字だけが異なるファイル名を生成しない、標準のファイル ピッカー ダイアログを使用する、大文字と小文字が変わる可能性があることなどに備えてください。
これは .NET 関数ではありませんが、Windows API の GetVolumeInformation および GetVolumeInformationByHandleW 関数が必要な処理を行います (yje lpFileSystemFlags パラメータを参照してください。
.NET クラス ライブラリにはそのような関数はありません。
ただし、独自のファイルを展開することはできます。小文字の名前でファイルを作成してから、その名前の大文字バージョンで開いてみてください。おそらくこの方法を改善することは可能ですが、アイデアはわかります。
編集 :実際には、ルート ディレクトリの最初のファイルを取得して、filename.ToLower() と filename.ToUpper() の両方が存在するかどうかを確認できます。残念ながら、同じファイルに大文字と小文字の両方のバリアントが存在する可能性は十分にあるため、小文字と大文字の両方のバリアントの FileInfo.Name プロパティを比較して、実際に同じかどうかを確認する必要があります。これは、ディスクへの書き込みを必要としません。
明らかに、ボリュームにファイルがまったくない場合、これは失敗します。この場合、最初のオプションにフォールバックします (実装については Martin の回答を参照してください)。
一時フォルダーにファイルを作成し (小文字のファイル名を使用)、ファイルが存在するかどうかを確認できます (大文字のファイル名を使用)。例:
string file = Path.GetTempPath() + Guid.NewGuid().ToString().ToLower();
File.CreateText(file).Close();
bool isCaseInsensitive = File.Exists(file.ToUpper());
File.Delete(file);