2009-08-12 15 views

Odpowiedz

23

Path.GetFullPath być może?

+3

Nie wierzę, że to gwarantuje zwrócenie nazwy kanonicznej. Gwarantuje tylko, że zwrócona nazwa może być użyta do odniesienia się do pliku absolutnie vs. względnie – JaredPar

+1

Path.GetFullPath (@ "c: \ aaa \ bbb \ .. \ ccc") = c: \ aaa \ ccc - wystarczająco dobre dla mnie. – mark

+0

Prawidłowe, ale nie sprawdza, czy ścieżka jest prawidłowa. –

16

Kanonizacja jest jednym z głównych obowiązków klasy Uri w .NET.

var path = @"c:\aaa\bbb\..\ccc"; 
var canonicalPath = new Uri(path).LocalPath; // c:\aaa\ccc 
+0

Zakładam więc, że ta kontrola rzeczywiście istnieje? – ashes999

+3

Nie, klasa 'Uri' jest odpowiedzialna tylko za generowanie ścieżek. System, w którym te ścieżki są istotne, nie jest brany pod uwagę.Gdy uzyskasz ścieżkę za pomocą metody w mojej odpowiedzi, nadal musisz sprawdzić, czy istnieje za pośrednictwem klasy "Plik" (lub cokolwiek innego). – bdukes

+6

Należy zauważyć, że nadal nie normalizuje się litera liter na dysku (np. "C: \" i "c: \" oba są niezmienione). Więc nie jest to tak naprawdę "kanoniczne" w sensie bycia wyjątkowym, w każdym razie. –

44

chciałbym napisać to tak:

public static string NormalizePath(string path) 
{ 
    return Path.GetFullPath(new Uri(path).LocalPath) 
       .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar) 
       .ToUpperInvariant(); 
} 

ten powinien obsługiwać kilka scenariuszy jak

  1. uri i potencjał uciekł znaków w nim, jak

    pliku : /// C: /Test%20Project.exe -> C: \ TEST PROJECT.EXE

  2. segmenty ścieżki określonej przez kropki w celu określenia aktualnego lub nadrzędnego katalogu

    c: \ aaa \ bbb \ .. \ ccc -> C: \ A A \ CCC

  3. tylda skrócony (long) ścieżki

    C: \ progra ~ 1 \ -> C: \ Program Files

  4. niespójne separatora katalogu charakter

    C:/Documents \ abc.txt -> C: \ Documents \ ABC.TXT

innych niż te, można go zignorować przypadek , ciąg dalszy \ znak ogranicznika katalogu itp.

+1

Dobre i zwięzłe rozwiązanie problemu normalizacji ścieżki, dokładnie tego, czego szukałem. +1 – Syon

+13

Nie używaj ToUpper() i znajomych dla dowolnego kodu, który chcesz przenosić. Na świecie są rozróżniane wielkości liter. Również nie jest tak dobrze, jeśli wyświetlasz te wartości użytkownikom, w którym to przypadku chcesz zachować wielkość liter i sortowanie bez użycia wielkości liter i porównania. W przeciwnym razie wygląda dobrze. – dhasenan

+2

To zależy dokładnie od tego, co masz na myśli przez "kanoniczny", ale ponieważ system Windows traktuje ścieżki plików jako niewrażliwe na wielkość liter, twierdzę, że * musisz * potrzebować konwersji przypadku, w przeciwnym razie możliwe jest, aby istniała więcej niż jedna ścieżka "kanoniczna" dla tego samego pliku. Wolałbym jednak małe litery. – Andy

Powiązane problemy