Den vollständigen Pfad ohne Dateinamen aus dem Pfad abrufen, der den Dateinamen enthält

197

Ist irgendetwas eingebaut System.IO.Path, das mir nur den Dateipfad gibt?

Zum Beispiel, wenn ich eine habe string

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

Gibt es eine BCL-Methode, die mir geben wird?

"c: \ webserver \ public \ myCompany \ configs \"?

CantSleepAgain
quelle
FWIW: Ich habe die Behandlung von "Pfaden" durch den Pfad "aufgegeben" und wir verwenden unsere eigenen Methoden mit besseren Erwartungen und Einheitlichkeit mit UNC (versuchen Sie, GetDirectoryName für einen UNC-Pfad zu verwenden) und Konventionen (z. B. trailing /).
user2864740
Wenn die Datei oder das Verzeichnis nicht vorhanden ist, kann nicht festgestellt werden, ob promo.xmleine Datei oder ein Verzeichnis mit demselben Namen bezeichnet wird. Das ist wahrscheinlich der Grund, warum Path.GetDirectoryName()es so einfach implementiert ist und nur das letzte Segment abschneidet oder den abschließenden Schrägstrich entfernt, falls es einen gibt.
Abel

Antworten:

240

Path.GetDirectoryName()... aber Sie müssen wissen, dass der Pfad, den Sie zu ihm übergeben, einen Dateinamen enthält; Es entfernt einfach das letzte Bit aus dem Pfad, unabhängig davon, ob es sich um einen Dateinamen oder einen Verzeichnisnamen handelt (es hat tatsächlich keine Ahnung, welcher).

Sie können zuerst validieren, indem Sie testen File.Exists()und / oder zuerst Directory.Exists()auf Ihrem Pfad nachsehen, ob Sie anrufen müssenPath.GetDirectoryName

Andrew Barber
quelle
2
Sie müssen nicht anrufen File.Exists(). In der Tat ist es eher kontraproduktiv, wenn Sie den Verzeichnisnamen suchen, wenn er noch nicht vorhanden ist.
Jon Hanna
3
In seinem Beispiel wird explizit ein Pfad mit einem Dateinamen angegeben. Wenn dies das Muster der Pfade ist, die er testet, und wenn diese Pfade vorhandene Dateien darstellen, wäre es sicherlich nützlich, File.Exists () zu überprüfen, würden Sie nicht zustimmen? Da die Situation natürlich anders sein könnte, schlug ich nur vor, dass er die Exists-Methoden für Datei und / oder Verzeichnis verwenden könnte. offensichtlich, wie es für seine Situation angemessen ist.
Andrew Barber
Ja, ein Pfad mit einem Dateinamen. Darin gibt es keine Hinweise darauf, dass eine Datei vorhanden ist, da Dateinamen an erster Stelle stehen.
Jon Hanna
4
Wie ich sagte; Dies ist eine Option und kann hilfreich sein, je nachdem, was über den Pfad bekannt ist. Oder es kann überhaupt nicht notwendig sein. Das Testen von File.Exists () und Directory.Exists () auf demselben Pfad ist jedoch eine schnelle und einfache Methode, um festzustellen, ob es sich bei einem vorhandenen Pfad um eine Datei oder ein Verzeichnis handelt.
Andrew Barber
5
Als Kurzreferenz, in Redundanz mit der Frage und "offensichtliche" Behandlung, müssen Sie einschließen, System.IOdamit dies funktioniert.
Cregox
70
Console.WriteLine(Path.GetDirectoryName(@"C:\hello\my\dear\world.hm")); 
Forscher
quelle
2
Das ist das beste. Denken Sie daran using System.IO;, Pfadmethoden zu verwenden
Syntaxfehler
Beachten Sie, dass dies keinen abschließenden Schrägstrich enthält (es ist trivial, einen hinzuzufügen)
Mingwei Samuel
51

Path.GetDirectoryName()Gibt den Verzeichnisnamen zurück, sodass Sie das, was Sie möchten (mit dem nachfolgenden umgekehrten Solidus-Zeichen), aufrufen können Path.GetDirectoryName(filePath) + Path.DirectorySeparatorChar.

Jon Hanna
quelle
12
    string fileAndPath = @"c:\webserver\public\myCompany\configs\promo.xml";

    string currentDirectory = Path.GetDirectoryName(fileAndPath);

    string fullPathOnly = Path.GetFullPath(currentDirectory);

aktuelles Verzeichnis: c: \ webserver \ public \ myCompany \ configs

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

Kobie Williams
quelle
6
Bitte geben Sie einige Informationen darüber an, wie der obige Code die Frage beantwortet, um diese Antwort zu verbessern.
Eric Hauenstein
1
Path.GetFullPath gibt den vollständigen Pfad ohne den Dateinamen zurück.
Kobie Williams
Das Anzeigen der Ausgabe wäre hilfreich. Ich habe keine Ahnung, was der Unterschied zwischen den letzten beiden Zeilen ist.
Gakera
Ausgabe wäre -> c: \ webserver \ public \ myCompany \ configs
Kobie Williams
5

Verwenden Sie 'GetParent ()' wie gezeigt, funktioniert gut. Fügen Sie nach Bedarf eine Fehlerprüfung hinzu.

var fn = openFileDialogSapTable.FileName;
var currentPath = Path.GetFullPath( fn );
currentPath = Directory.GetParent(currentPath).FullName;
Kevinwaite
quelle
4

Ich habe das benutzt und es funktioniert gut:

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
quelle