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.