Hier ist eine grundlegende und relativ schnelle Lösung, halte unten für einige Kommentare zu lesen:
private static string GetCase(string path)
{
DirectoryInfo dir = new DirectoryInfo(path);
if (dir.Exists)
{
string[] folders = dir.FullName.Split(Path.DirectorySeparatorChar);
dir = dir.Root;
foreach (var f in folders.Skip(1))
{
dir = dir.GetDirectories(f).First();
}
return dir.FullName;
}
else
{
return path;
}
}
Die Grundidee ist, dass das Erhalten von Unterverzeichnissen von einem DirectoryInfo-Objekt Sie bekommen wird der richtige Fall, also müssen wir nur den Verzeichnisnamen aufteilen und von der Wurzel zum Zielverzeichnis gehen, um bei jedem Schritt den richtigen Fall zu erhalten.
Meine erste Antwort verließ sich darauf, das Gehäuse für jeden Ordner auf dem Laufwerk zu bekommen, und es funktionierte, war aber langsam. Ich kam zu einer leichten Verbesserung, die die Ergebnisse speicherte, aber für den täglichen Gebrauch war es immer noch zu langsam. Sie können den Bearbeitungsverlauf für diesen Kommentar sehen, wenn Sie dies für jedes Objekt auf dem Laufwerk tun müssen, und selbst dann gibt es wahrscheinlich Möglichkeiten, diesen Code zu beschleunigen. Es war "Hier ist, wie Sie es tun könnten" und nicht "hier ist ein guter Weg, es zu tun."
Bertu, in seiner Antwort, kam auf die Idee des Teilens den Weg in seine Komponenten und bekommen das Gehäuse Stück für Stück nach oben, die in einer großen Geschwindigkeitserhöhung führt, da Sie nicht mehr sind alles Überprüfung als in meiner ursprünglichen Antwort. Bertu verallgemeinerte auch seine Lösung, sowohl Dateien als auch Verzeichnisse zu erstellen. In meinen Tests läuft der oben genannte Code (der Bertus "spaltet den Pfad und tu es nach Stücken" Idee aber nähert es iterativ statt rekursiv) in etwa der Hälfte der Zeit von Bertus Code. Ich bin mir nicht sicher, ob das daran liegt, dass seine Methode auch Dateien verarbeitet, weil seine Verwendung der Rekursion zusätzlichen Overhead verursacht, oder weil er in jeder Iteration Path.GetFileName(path)
und Path.GetDirectoryName(path)
aufruft. Abhängig von Ihren genauen Bedürfnissen, wird eine Kombination aus Ihrer Antwort und meiner wahrscheinlich Ihr Problem lösen, wie es in C# möglich ist.
In diesem Sinne sollte ich erwähnen, dass es gibt some limitations zu .Net Dateiname Handhabung, und da dies in.Net erfordert eine Menge von DirectoryInfo Objekte machen, möchten Sie möglicherweise nicht verwalteten Code berücksichtigen, wenn dies Ihr Engpass ist.
Es gibt keine Funktion, um dies zu tun, und versuchen, Zeichenfolgen wie "HelloAgain" zu "HalloAgain" zu normalisieren wird ein Problem sein, da auch Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase ("HLloAgain") "Helloagain. –
@Agent, DirectoryInfo. GetDirectories() gibt Ordner im Dateisystem zurück – Kevin
Akzeptiert, wow, ich hatte keine Ahnung, dass neue Antworten hier waren Danke an Iceman und Bertu für die Hilfe bei der Lösung – Tom