2015-05-22 12 views
5

Potrzebuję uzyskać nazwę katalogu z jego ścieżki, niezależnie od tego, czy istnieje końcowy ukośnik odwrotny. Na przykład, użytkownik może wejściowe jeden z następujących 2 strun i muszę nazwę katalogu kłody:Uzyskaj nazwę katalogu z pełnej ścieżki katalogu, niezależnie od końcowego ukośnika

"C:\Program Files (x86)\My Program\Logs" 
"C:\Program Files (x86)\My Program\Logs\" 

żaden z poniższych daje poprawną odpowiedź ("Logs"):

Path.GetDirectoryName(m_logsDir); 
FileInfo(m_logsDir).Directory.Name; 

Najwyraźniej analizować ciąg znaków i w pierwszym przykładzie decydują, że Logs jest plikiem, podczas gdy naprawdę jest katalogiem.

Powinno więc sprawdzić, czy ostatnie słowo (Logs w naszym przypadku) jest tak naprawdę katalogiem; jeśli tak, zwróć to, jeśli nie (Logi mogą być również plikiem), zwróć katalog nadrzędny. Jeśli wymagałoby to obsługi rzeczywistego systemu plików, zamiast analizowania samego ciągu.

Czy istnieje jakaś standardowa funkcja do tego?

+1

Plik nie musi mieć rozszerzenie –

+0

można wyjaśnić swoje pytanie, czy chcesz, aby zapewnić chwytając nazwę folderu dziennika, czy po prostu chcesz katalogu dzienników? – Greg

+0

Chcę uzyskać "Logi", ale upewnij się, że to naprawdę folder, a nie plik. Sprawdzanie, czy plik 'System.IO.Directory.Exists (m_logsDir)' wygląda na wykonalne rozwiązanie. – dimnnv

Odpowiedz

2

To może pomóc

var result = System.IO.Directory.Exists(m_logsDir) ? 
       m_logsDir: 
       System.IO.Path.GetDirectoryName(m_logsDir); 
+0

Czuje się mniej wydajnie niż odpowiedź, którą wysłałem, gdy po prostu sprawdzisz flagę – Voidpaw

+1

@dimnnv W pytaniu powiedziałeś, że poprawna odpowiedź to "Logi". Przyjęta odpowiedź nie zwraca tego, że –

0

za to mamy fragment kodu wzdłuż linii:

m_logsDir.HasFlag(FileAttribute.Directory); //.NET 4.0 

lub

(File.GetAttributes(m_logsDir) & FileAttributes.Directory) == FileAttributes.Directory; // Before .NET 4.0 
0

Pozwól mi przeformułować moją odpowiedź, bo mają dwie potencjalne wady przez czynniki wyróżniające. Jeśli tak:

var additional = @"C:\Program Files (x86)\My Program\Logs\"; 
var path = Path.GetDirectoryName(additional); 

Twój wynik byłby zgodnie z przeznaczeniem, Logs. Jeśli jednak zrobić:

var additional = @"C:\Program Files (x86)\My Program\Logs"; 
var path = Path.GetDirectoryName(additional); 

Twój wynik byłby My Program, co powoduje różnicę w wydajności. Chciałbym też spróbować wymusić zakończenie \ inaczej może być w stanie zrobić coś takiego jak ten:

var additional = @"C:\Program Files (x86)\My Program\Logs"; 
var filter = additional.Split('\\'); 
var getLast = filter.Last(i => !string.IsNullOrEmpty(i)); 

Mam nadzieję, że to pomaga.

+1

Jeśli na końcu nie było \, to zwróciłoby "Mój program". – Ralf

+0

@Ralf Tak, dlatego poprawiłem swoją odpowiedź. – Greg

+0

Lepsza, ale ... Ścieżka nie ma pojęcia o systemie plików, a jedynie o składni. A dimnv chce odróżnić plik od katalogu, więc DirectoryInfo jest lepszą opcją w porównaniu do klasy Path. – Ralf

5
new DirectoryInfo(m_logsDir).Name; 
+1

To działa dla moich 2 przykładów, ale co się stanie, jeśli Logs jest tak naprawdę plikiem, a nie katalogiem? Czy rzuci wyjątek? – dimnnv

+1

Nie, ale DirectoryInfo ma właściwość Exists, którą można po prostu sprawdzić. – Ralf

+0

Jeśli "C: \ Program Files (x86) \ Mój program \ Logi" jest plikiem, 'new DirectoryInfo (m_logsDir) .Exists' zwraca wartość false. Będziesz miał wyjątek IOException, jeśli spróbujesz utworzyć katalog ('new DirectoryInfo (m_logsDir) .Create();) –

Powiązane problemy