Obtenez le chemin complet sans nom de fichier à partir du chemin qui inclut le nom de fichier


198

Y a-t-il quelque chose de intégré System.IO.Pathqui me donne juste le chemin du fichier?

Par exemple, si j'ai un string

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

y a-t-il une méthode BCL qui me donnera

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



FWIW: J'ai "abandonné" la gestion des "chemins" par le Chemin et nous utilisons nos propres méthodes avec de meilleures attentes et uniformité avec UNC (essayez d'utiliser GetDirectoryName sur un chemin UNC) et les conventions (par exemple. Trailing /).
user2864740

Sauf si le fichier ou le répertoire existe, il n'y a aucun moyen de savoir si promo.xmldésigne un fichier ou un répertoire du même nom. C'est probablement pourquoi Path.GetDirectoryName()est implémenté si simple et tronque simplement le dernier segment, ou supprime la barre oblique s'il y en a un.
Abel

Réponses:


241

Path.GetDirectoryName()... mais vous devez savoir que le chemin que vous lui passez contient un nom de fichier; il supprime simplement le bit final du chemin, que ce soit un nom de fichier ou un nom de répertoire (il n'a en fait aucune idée de qui).

Vous pouvez d'abord valider en testant File.Exists()et / ou Directory.Exists()sur votre chemin d'abord pour voir si vous devez appelerPath.GetDirectoryName


2
Pas besoin d'appeler File.Exists(). En effet, c'est plutôt contre-productif dans le cas où votre raison de trouver le nom du répertoire est de le créer s'il n'existe pas déjà.
Jon Hanna

3
Son exemple note explicitement un chemin d'accès avec un nom de fichier. Si tel est le modèle des chemins qu'il teste, et si ces chemins représentent des fichiers existants, vérifier File.Exists () serait sûrement utile, n'êtes-vous pas d'accord? Parce que la situation pourrait être différente, bien sûr, je suggérais simplement qu'il «pouvait» utiliser les méthodes Exists sur File et / ou Directory; évidemment, selon sa situation.
Andrew Barber

Oui, un chemin d'accès avec un nom de fichier. Il n'y a rien là-dedans pour indiquer qu'un fichier existe, car les noms de fichiers viennent en premier.
Jon Hanna

4
Comme j'ai dit; c'est une option et cela peut aider selon ce que l'on sait du chemin. Ou cela peut ne pas être nécessaire du tout. Mais tester File.Exists () et Directory.Exists () sur le même chemin est un moyen rapide et facile de savoir si un chemin, qui existe, est un fichier ou un répertoire.
Andrew Barber

5
comme référence rapide, en redondance avec la question, et un traitement "évident", vous devez l'inclure System.IOpour que cela fonctionne.
cregox

70
Console.WriteLine(Path.GetDirectoryName(@"C:\hello\my\dear\world.hm")); 

2
C'est le meilleur. N'oubliez using System.IO;pas d'utiliser les méthodes de chemin
Erreur de syntaxe

Notez que cela n'inclut pas de barre oblique (son trivial pour en ajouter un)
Mingwei Samuel

51

Path.GetDirectoryName()renvoie le nom du répertoire, donc pour ce que vous voulez (avec le caractère solidus inversé de fin), vous pouvez appeler 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
Veuillez fournir des informations sur la façon dont le code ci-dessus répond à la question afin d'améliorer cette réponse.
Eric Hauenstein

1
Path.GetFullPath renvoie le chemin complet sans le nom de fichier.
Kobie Williams

montrant la sortie serait utile, je n'ai aucune idée de la différence entre les deux dernières lignes.
gakera

la sortie serait -> c: \ webserver \ public \ myCompany \ configs
Kobie Williams

5

Utilisez «GetParent ()» comme indiqué, fonctionne bien. Ajoutez la vérification des erreurs selon vos besoins.

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

4

Je l'ai utilisé et cela fonctionne bien:

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));
        }
    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.