Uzyskaj pełną ścieżkę bez nazwy pliku ze ścieżki zawierającej nazwę pliku

198

Czy jest coś wbudowanego, System.IO.Pathco daje mi tylko ścieżkę do pliku?

Na przykład, jeśli mam string

@ "c: \ webserver \ public \ myCompany \ configs \ promo.xml",

czy jest jakaś metoda BCL, która mi da

„c: \ webserver \ public \ myCompany \ configs \”?

CantSleepAgain
źródło
FWIW: „Zrezygnowałem” z obsługi ścieżki przez „ścieżki” i używamy własnych metod o lepszych oczekiwaniach i jednolitości w UNC (spróbuj użyć GetDirectoryName na ścieżce UNC) i konwencji (np. Trailing /).
user2864740,
O ile plik lub katalog nie istnieje, nie ma możliwości sprawdzenia, czy promo.xmloznacza on plik czy katalog o tej samej nazwie. Prawdopodobnie dlatego Path.GetDirectoryName()jest zaimplementowany tak prosto i po prostu obcina ostatni segment lub usuwa ukośnik, jeśli taki istnieje.
Abel

Odpowiedzi:

241

Path.GetDirectoryName()... ale musisz wiedzieć, że ścieżka, którą do niej podajesz, zawiera nazwę pliku; po prostu usuwa ostatni bit ze ścieżki, niezależnie od tego, czy jest to nazwa pliku, czy nazwa katalogu (tak naprawdę nie ma pojęcia, który).

Możesz najpierw zweryfikować, testując File.Exists()i / lub Directory.Exists()na swojej drodze, aby sprawdzić, czy musisz zadzwonićPath.GetDirectoryName

Andrew Barber
źródło
2
Nie ma potrzeby dzwonić File.Exists(). Rzeczywiście, przynosi raczej efekt przeciwny do zamierzonego w przypadku, gdy powodem znalezienia nazwy katalogu jest jej utworzenie, jeśli jeszcze nie istnieje.
Jon Hanna
3
Jego przykład wyraźnie wskazuje ścieżkę o nazwie pliku. Jeśli jest to wzór ścieżek, które testuje, i jeśli ścieżki te reprezentują istniejące pliki, sprawdzenie File.Exists () z pewnością byłoby przydatne, czy nie zgodziłbyś się? Ponieważ sytuacja mogłaby być inna, oczywiście sugerowałem, że „mógłby” skorzystać z metod Exists w pliku i / lub katalogu; oczywiście odpowiednie dla jego sytuacji.
Andrew Barber
Tak, ścieżka o nazwie pliku. Nie ma w tym nic, co wskazywałoby na istnienie pliku, ponieważ nazwy plików są na pierwszym miejscu.
Jon Hanna
4
Tak jak powiedziałem; jest to opcja i może pomóc w zależności od tego, co wiadomo na temat ścieżki. Lub może nie być wcale konieczne. Ale testowanie File.Exists () i Directory.Exists () na tej samej ścieżce to szybki i łatwy sposób na sprawdzenie, czy istniejąca ścieżka jest plikiem lub katalogiem.
Andrew Barber,
5
jako krótkie odniesienie, w ramach redundancji do pytania i „oczywistej” uczty, musisz dołączyć, System.IOaby to zadziałało.
cregox,
70
Console.WriteLine(Path.GetDirectoryName(@"C:\hello\my\dear\world.hm")); 
poszukiwacz
źródło
2
To jest najlepszy. Pamiętaj, using System.IO;aby używać metod ścieżki
błąd składni
Zauważ, że nie obejmuje to ukośnika końcowego (jego dodanie jest banalne)
Mingwei Samuel
51

Path.GetDirectoryName()zwraca nazwę katalogu, więc dla tego, co chcesz (z końcowym znakiem odwrotnego solidusu), możesz wywołać Path.GetDirectoryName(filePath) + Path.DirectorySeparatorChar.

Jon Hanna
źródło
12
    string fileAndPath = @"c:\webserver\public\myCompany\configs\promo.xml";

    string currentDirectory = Path.GetDirectoryName(fileAndPath);

    string fullPathOnly = Path.GetFullPath(currentDirectory);

currentDirectory: c: \ webserver \ public \ myCompany \ configs

fullPathOnly: c: \ webserver \ public \ myCompany \ configs

Kobie Williams
źródło
6
Podaj kilka informacji, w jaki sposób powyższy kod odpowiada na pytanie, aby poprawić tę odpowiedź.
Eric Hauenstein,
1
Path.GetFullPath zwraca pełną ścieżkę bez nazwy pliku.
Kobie Williams
pokazanie wyniku byłoby pomocne, nie mam pojęcia, jaka jest różnica między dwoma ostatnimi wierszami.
gakera
wynik byłby -> c: \ webserver \ public \ myCompany \ configs
Kobie Williams
5

Użyj „GetParent ()” jak pokazano, działa dobrze. Dodaj sprawdzanie błędów według potrzeb.

var fn = openFileDialogSapTable.FileName;
var currentPath = Path.GetFullPath( fn );
currentPath = Directory.GetParent(currentPath).FullName;
Kevinwaite
źródło
4

Użyłem tego i działa dobrze:

string[] filePaths = Directory.GetFiles(Path.GetDirectoryName(dialog.FileName));

foreach (string file in filePaths)
{   
    if (comboBox1.SelectedItem.ToString() == "")
    {
        if (file.Contains("c"))
        {
            comboBox2.Items.Add(Path.GetFileName(file));
        }
    }
}
Karam
źródło