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

CantSleepAgain
la source
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

Andrew Barber
la source
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")); 
explorateur
la source
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.

Jon Hanna
la source
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

Kobie Williams
la source
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;
kevinwaite
la source
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));
        }
    }
}
Karam
la source