Comment puis-je obtenir le répertoire à partir du chemin d'accès complet d'un fichier?

527

Quelle est la façon la plus simple d'obtenir le répertoire dans lequel se trouve un fichier? J'utilise ceci pour définir un répertoire de travail.

string filename = @"C:\MyDirectory\MyFile.bat";

Dans cet exemple, je devrais obtenir "C: \ MyDirectory".

Même Mien
la source
3
Cela ne devrait-il pas être un littéral de chaîne? @"C:\MyDirectory\MyFile.bat"
Edgar
3
Quelqu'un veut-il protéger cette question qui a le droit de le faire? 11 réponses similaires avec la dernière de 2017 ..
Boern

Réponses:

838

Si vous avez définitivement un chemin absolu, utilisez Path.GetDirectoryName(path).

Si vous ne pouvez obtenir qu'un nom relatif, utilisez new FileInfo(path).Directory.FullName.

Notez que Pathet se FileInfotrouvent tous les deux dans l'espace de noms System.IO.

Jon Skeet
la source
1
En effet, mais existe-t-il une méthode appelée GetDirectory? N'est-ce pas GetDirectoryName?
Brandon
1
Vous pouvez simplement utiliser DirectoryName au lieu de Directory.FullPath ne pouvez-vous pas?
Steven Robbins
1
J'étais à l'épreuve contre la réception d'un nom relatif. Je n'avais pas remarqué que le chemin sera absolu. J'ai maintenant les deux versions :)
Jon Skeet
Utilisez-vous snippy pour vérifier cela? ;)
shahkalpesh
1
@UlyssesAlves: Je pense que cela new FileInfo(path).Directory.FullNamedevrait fonctionner dans les deux cas.
Jon Skeet
60
System.IO.Path.GetDirectoryName(filename)
Cherian
la source
22
Path.GetDirectoryName(filename);
Grzenio
la source
12

Vous pouvez utiliser System.IO.Path.GetDirectory(filename)ou transformer le chemin d'accès en un FileInfoet utiliser FileInfo.Directory.

Si vous faites d'autres choses avec le chemin, cela FileInfopeut avoir des avantages.

Reed Copsey
la source
1
il n'y a pas de méthode 'GetDirectory dans la classe Path; vous devez avoir voulu dire «GetDirectoryName
BillW
12

Utilisez le code mentionné ci-dessous pour obtenir le chemin du dossier

Path.GetDirectoryName(filename);

Cela renverra "C: \ MyDirectory" dans votre cas

thejustv
la source
10

Vous pouvez utiliser Path.GetDirectoryNameet simplement passer le nom de fichier.

Lien MSDN

Brandon
la source
5

Si vous travaillez avec un FileInfoobjet, il existe un moyen simple d'extraire une stringreprésentation du chemin complet du répertoire via la DirectoryNamepropriété.

Description de la FileInfo.DirectoryNamepropriété via MSDN:

Obtient une chaîne représentant le chemin d'accès complet du répertoire.

Exemple d'utilisation:

string filename = @"C:\MyDirectory\MyFile.bat";
FileInfo fileInfo = new FileInfo(filename);
string directoryFullPath = fileInfo.DirectoryName; // contains "C:\MyDirectory"

Lien vers la documentation MSDN .

Derek W
la source
5

Vous pouvez obtenir le chemin d'application actuel en utilisant:

string AssemblyPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location).ToString();

Bonne chance!

David Castro
la source
0

Tout d'abord, vous devez utiliser l'espace de noms System.IO. Alors;

string filename = @"C:\MyDirectory\MyFile.bat";
string newPath = Path.GetFullPath(fileName);

ou

string newPath = Path.GetFullPath(openFileDialog1.FileName));
Umut D.
la source
0

Vous pouvez utiliser Path.GetFullPathpour la plupart des cas. Mais si vous souhaitez obtenir le chemin également dans le cas où le nom de fichier est relativement localisé, vous pouvez utiliser la méthode générique ci-dessous:

string GetPath(string filePath)
{
  return Path.GetDirectoryName(Path.GetFullPath(filePath))
}

Par exemple:

GetPath("C:\Temp\Filename.txt") revenir "C:\Temp\"

GetPath("Filename.txt")retourner current working directorycomme"C:\Temp\"

Minh Nguyen
la source
0

Dans mon cas, j'avais besoin de trouver le nom du répertoire d'un chemin complet (d'un répertoire) alors j'ai simplement fait:

var dirName = path.Split('\\').Last();
Amir sans famille
la source
1
Le PO a besoin "C:\MyDirectory"et non MyDirectory. Le conseil d'utiliser des méthodes de manipulation de chaînes est risqué, il existe de nombreux pièges, utilisez plutôt des Pathméthodes dédiées .
Sinatr
-1

Path.GetDirectoryName (Context.Parameters ["assemblypath"])

Ami Vaknin
la source
Path.GetDirectoryNameest mentionné dans de nombreuses autres réponses (y compris la réponse acceptée)
barbsan
ahha? Donc?? y a-t-il un point à venir?
Ami Vaknin