2009-03-19 9 views

Répondre

71

Utilisation:

new FileInfo(@"C:\temp\temp2\foo\bar.txt").Directory.Name 
+3

Selon http://msdn.microsoft.com/en-us/library/system.io.fileinfo.fileinfo.aspx le constructeur FileInfo peut jeter si l'appelant ne dispose pas de l'autorisation nécessaire. Existe-t-il une alternative qui ne fera qu'analyser la chaîne sans aucune E/S? – GuiSim

+0

@GuiSim: Pas que je sache. –

+10

Dans le cas où quelqu'un a besoin du chemin complet du répertoire, utilisez 'nouveau FileInfo (@ "C: \ temp \ temp2 \ foo \ bar.txt"). DirectoryName' à la place. –

7

Loin de moi d'être en désaccord avec le pigeon d'argile, mais je l'ai toujours utilisé

Path.GetFileNameWithoutExtension(@"C:\temp\temp2\foo\bar.txt") 

Je soupçonne que FileInfo touche effectivement le système de fichiers pour l'obtenir est d'info , alors que je pense que GetFileNameWithoutExtension est que les opérations de chaîne - donc la performance de l'un sur l'autre pourrait être mieux.

+0

Il y a une légère différence dans les résultats ici ... Je pense que votre approche retourne "barre" quand la question demande comment obtenir "foo" le répertoire contenant le fichier ... –

+7

J'ai appris deux choses aujourd'hui ... Lire la question et jamais en désaccord avec le Skeet. – Handleman

+2

Path.getDirectoryName ne fait-il pas exactement ce qu'il veut? –

2

J'ai eu une occasion où je Boucler dans les répertoires enfants de parents

string[] years = Directory.GetDirectories(ROOT); 
foreach (var year in years) 
{ 
    DirectoryInfo info = new DirectoryInfo(year); 
    Console.WriteLine(info.Name); 
    Console.WriteLine(year); 
    //Month directories 
    string[] months = Directory.GetDirectories(year); 
    foreach (var month in months) 
    { 
     Console.WriteLine(month); 
     //Day directories 
     string[] days = Directory.GetDirectories(month); 
     foreach (var day in days) 
     { 
      //checkes the files in the days 
      Console.WriteLine(day); 
      string[] files = Directory.GetFiles(day); 
      foreach (var file in files) 
      { 
       Console.WriteLine(file);        
      } 
     } 
    } 
} 

en utilisant cette ligne que j'ai pu obtenir que le nom du répertoire courant

DirectoryInfo info = new DirectoryInfo(year); 
Console.WriteLine(info.Name); 
+0

+1 Je fais presque exactement la même chose ... – SMUsamaShah

1

cela dépendra de la façon dont vous vouloir gérer les données, mais une autre option consiste à utiliser String.Split. Cela ne vérifie pas l'existence d'une exception hors-limite de tableau, mais vous en avez l'idée.

+0

Ça va échouer sous Linux. – JensG

+0

Path.DirectorySeparatorChar – Ruudjah

7

Je pense que la solution la plus simple est

 
DirectoryInfo dinfo = new DirectoryInfo(path); 

string folderName= dinfo.Parent.Name; 
3

Miser sur la suggestion de Handleman, vous pouvez faire:

Path.GetFileName(Path.GetDirectoryName(path)) 

Cela ne touche pas le système de fichiers (contrairement FileInfo), et fera ce qui est nécessaire . Cela fonctionne avec les dossiers parce que, comme le dit MSDN:

Valeur de retour: Les caractères après le dernier caractère de répertoire dans le chemin. Si le dernier caractère de chemin est un séparateur de répertoire ou de volume, cette méthode retourne String.Empty. Si le chemin est null, cette méthode renvoie null.

Aussi, en regardant le reference source confirme que GetFilename ne se soucie pas si le chemin est passé dans un fichier ou un dossier: il est juste de faire de la pure manipulation de chaîne.

Questions connexes