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



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


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

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.


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


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;

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));
        }
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.