Oto rozwiązanie proste i stosunkowo szybko, zachować czytania poniżej jakiegoś komentarza:
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;
}
}
Podstawową ideą polega na tym, że pobranie podkatalogów z obiektu DirectoryInfo dostaniemy poprawny przypadek, więc wystarczy podzielić nazwę katalogu i przejść od katalogu głównego do katalogu docelowego, uzyskując prawidłowy przypadek w każdym kroku.
Moja początkowa odpowiedź polegała na uzyskaniu obudowy dla każdego folderu na dysku i działała, ale była wolna. Wprowadziłem niewielką poprawę, która zapisywała wyniki, ale wciąż była zbyt powolna do codziennego użytku. Możesz zobaczyć historię edycji tego komentarza, jeśli chcesz to zrobić dla każdej rzeczy na dysku, a nawet wtedy są prawdopodobnie sposoby na przyspieszenie tego kodu. To było "tutaj, jak możesz to zrobić", a nie "tutaj jest świetny sposób na zrobienie tego".
Bertu, w swojej odpowiedzi, wpadł na pomysł podziału ścieżkę do jego składników i uzyskanie kawałek po kawałku obudowy, co skutkuje ogromny wzrost prędkości ponieważ nie jesteś już sprawdzanie wszystko jako w mojej oryginalnej odpowiedzi. Bertu uogólnił także swoje rozwiązanie do robienia plików, a także katalogów. W moich testach powyższy kod (wykorzystujący koncepcję Bertu "dzielę ścieżkę i robię to na kawałki", ale podchodzi do niej iteracyjnie zamiast rekursywnie) działa w około połowie czasu kodu Bertu. Nie jestem pewien, czy to dlatego, że jego metoda obsługuje również pliki, ponieważ jego użycie rekursji wprowadza dodatkowy narzut lub dlatego, że kończy się wywoływaniem w każdej iteracji Path.GetFileName(path)
i . W zależności od Twoich konkretnych potrzeb, pewna kombinacja jego odpowiedzi i mojej prawdopodobnie rozwiąże Twój problem, jak to tylko możliwe w języku C#.
W tym pamiętać, należy wspomnieć, że istnieją some limitations do .Net obsługi nazw plików, a ponieważ robi to w .NET wymaga podejmowania wielu obiektów DirectoryInfo, może warto rozważyć kod niezarządzanej jeśli jest to wąskie gardło.
Jest nie ma takiej funkcji, a próba normalizacji łańcuchów takich jak "HElloAgain" do "helloAgain" będzie problemem, ponieważ nawet Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase ("HElloAgain") zwróci wartość "Helloagain." –
@Agent, DirectoryInfo. GetDirectories() zwraca foldery w systemie plików: – Kevin
Zaakceptowany, wow, nie miałem pojęcia, że są tu nowe odpowiedzi, dzięki Icemanowi i Bertu za pomoc w rozwiązaniu tego problemu – Tom