Denken Sie daran, dass Sie möglicherweise mehrere Dateisysteme mit unterschiedlichen Groß-/Kleinschreibungsregeln haben. Zum Beispiel könnte das Root-Dateisystem zwischen Groß- und Kleinschreibung unterscheiden, aber Sie können ein Dateisystem haben, bei dem die Groß-/Kleinschreibung nicht beachtet wird (z. B. ein USB-Stick mit einem FAT-Dateisystem darauf), das irgendwo gemountet wird. Wenn Sie also solche Überprüfungen durchführen, stellen Sie sicher, dass Sie sie in dem Verzeichnis durchführen, auf das Sie zugreifen werden.
Was passiert auch, wenn der Benutzer die Daten beispielsweise von einem Dateisystem kopiert, bei dem die Groß-/Kleinschreibung beachtet wird, in ein Dateisystem, bei dem die Groß-/Kleinschreibung nicht berücksichtigt wird? Wenn Sie Dateien haben, die sich nur durch Groß- und Kleinschreibung unterscheiden, überschreibt eine von ihnen die andere, was zu Datenverlust führt. Auch beim Kopieren in die andere Richtung kann es zu Problemen kommen, zB wenn Datei A einen Verweis auf Datei "b" enthält, die Datei aber eigentlich "B" heißt. Dies funktioniert auf dem ursprünglichen Dateisystem, bei dem die Groß-/Kleinschreibung nicht beachtet wird, aber nicht auf dem System, bei dem die Groß-/Kleinschreibung beachtet wird.
Daher würde ich vorschlagen, dass Sie vermeiden, ob das Dateisystem zwischen Groß- und Kleinschreibung unterscheidet oder nicht, wenn Sie können. Generieren Sie keine Dateinamen, die sich nur durch Groß- und Kleinschreibung unterscheiden, verwenden Sie die Standarddialoge zur Dateiauswahl, seien Sie darauf vorbereitet, dass sich die Groß-/Kleinschreibung ändern könnte usw.
Es ist keine .NET-Funktion, aber die Funktionen GetVolumeInformation und GetVolumeInformationByHandleW von der Windows-API werden tun, was Sie wollen (siehe yje lpFileSystemFlags-Parameter.
In der .NET-Klassenbibliothek gibt es keine solche Funktion.
Sie können jedoch Ihre eigene einführen:Versuchen Sie, eine Datei mit einem Kleinbuchstabennamen zu erstellen, und versuchen Sie dann, sie mit der Großbuchstabenversion ihres Namens zu öffnen. Wahrscheinlich ist es möglich, diese Methode zu verbessern, aber Sie haben die Idee.
BEARBEITEN :Sie könnten tatsächlich einfach die erste Datei im Stammverzeichnis nehmen und dann prüfen, ob sowohl filename.ToLower() als auch filename.ToUpper() existieren. Leider ist es durchaus möglich, dass sowohl Groß- als auch Kleinbuchstabenvarianten derselben Datei existieren, daher sollten Sie die FileInfo.Name-Eigenschaften der Kleinbuchstaben- und Großbuchstabenvarianten vergleichen, um festzustellen, ob sie tatsächlich gleich sind oder nicht. Dies erfordert kein Schreiben auf die Festplatte.
Offensichtlich schlägt dies fehl, wenn sich überhaupt keine Dateien auf dem Volume befinden. Greifen Sie in diesem Fall einfach auf die erste Option zurück (siehe Martins Antwort zur Implementierung).
Sie können eine Datei im temporären Ordner erstellen (unter Verwendung von Dateinamen in Kleinbuchstaben) und dann prüfen, ob die Datei existiert (unter Verwendung von Dateinamen in Großbuchstaben), z. B.:
string file = Path.GetTempPath() + Guid.NewGuid().ToString().ToLower();
File.CreateText(file).Close();
bool isCaseInsensitive = File.Exists(file.ToUpper());
File.Delete(file);