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 \”?



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


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")); 

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.


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


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;

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));
        }
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.