2010-09-30 6 views
140

Y at-il quelque chose construit dans System.IO.Path qui me donne juste le chemin du fichier?Obtenir le chemin d'accès complet sans nom de fichier à partir du chemin qui contient le nom de fichier

Par exemple, si j'ai un string

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

est-il une méthode BCL qui donnera moi

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

+5

double possible de [Comment puis-je obtenir le répertoire du chemin complet d'un fichier?] (Http://stackoverflow.com/questions/674479/how-do-i-get-the- directory-from-a-files-full-path) – bluish

+0

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

Répondre

175

Path.GetDirectoryName() ... mais vous devez savoir que le chemin que vous y passez contient un nom de fichier; il supprime simplement le bit final du chemin, qu'il s'agisse d'un nom de fichier ou d'un nom de répertoire (il n'a en fait aucune idée de quoi).

Vous pouvez valider d'abord en testant File.Exists() et/ou Directory.Exists() sur votre chemin d'abord si vous avez besoin d'appeler Path.GetDirectoryName

+2

Il n'est pas nécessaire d'appeler 'File.Exists()'. En effet, il 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à. –

+2

Son exemple mentionne explicitement un chemin 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 certainement utile, ne seriez-vous pas d'accord? Parce que la situation pourrait être différente, bien sûr, je suggérais simplement qu'il «pourrait» utiliser les méthodes Exists sur Fichier et/ou Répertoire; évidemment, en fonction de sa situation. –

+0

Oui, un chemin avec un nom de fichier. Il n'y a rien pour indiquer qu'un fichier existe, car les noms de fichiers viennent en premier. –

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

C'est le meilleur. Rappelez-vous 'using System.IO;' pour utiliser les méthodes path –

45

Path.GetDirectoryName() retourne le nom du répertoire, donc ce que vous voulez (avec l'inverse de fuite caractère solidus), vous pouvez appeler Path.GetDirectoryName(filePath) + Path.DirectorySeparatorChar.

+6

+1 Path.DirectorySeparatorChar était utile – mack

4

J'utilisé cela et il 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)); 
     } 
    } 
} 
4

utilisation GetParent() 'comme indiqué, fonctionne bien. Ajoutez la vérification d'erreur selon vos besoins.

var fn = openFileDialogSapTable.FileName; 
var currentPath = Path.GetFullPath(fn); 
currentPath = Directory.GetParent(currentPath).FullName; 
0
string fileAndPath = @"c:\webserver\public\myCompany\configs\promo.xml"; 

    string currentDirectory = Path.GetDirectoryName(fileAndPath); 

    string fullPathOnly = Path.GetFullPath(currentDirectory); 
+2

Veuillez fournir quelques informations sur la façon dont le code ci-dessus répond à la question afin d'améliorer cette réponse. –

Questions connexes