2009-03-19 11 views

risposta

71

Usa:

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

Secondo http://msdn.microsoft.com/en-us/library/system.io.fileinfo.fileinfo.aspx costruttore FileInfo può buttare se il chiamante non ha l'autorizzazione necessaria. Esiste un'alternativa che analizzerà solo la stringa senza IO? – GuiSim

+0

@GuiSim: non che io sappia. –

+10

Nel caso in cui qualcuno abbia bisogno del percorso completo della directory, usare 'new FileInfo (@" C: \ temp \ temp2 \ foo \ bar.txt "). DirectoryName' invece. –

7

Lungi da me essere in disaccordo con la Skeet, ma ho sempre usato

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

Ho il sospetto che FileInfo in realtà tocca il file system per ottenere che sia informazioni , dove mi aspetto che GetFileNameWithoutExtension sia solo operazioni a stringa, quindi le prestazioni di una sull'altra potrebbero essere migliori.

+0

C'è una leggera differenza nei risultati qui ... Penso che il tuo approccio restituisca "bar" quando la domanda è come ottenere "foo" nella directory contenente il file ... –

+7

Ho imparato due cose oggi ... Leggi la domanda e mai in disaccordo con lo Skeet. – Handleman

+2

Does Path.getDirectoryName non fa esattamente ciò che vuole? –

2

ho avuto un'occasione in cui stavo scorrendo genitore figlio directory

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);        
      } 
     } 
    } 
} 

utilizzando questa linea sono stato in grado di ottenere solo il nome della directory corrente

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

+1 Sto facendo quasi esattamente lo stesso ... – SMUsamaShah

1

Sarà dipende da come si vuoi gestire i dati, ma un'altra opzione è usare String.Split.

string myStr = @"C:\foo\bar.txt"; 
string[] paths = myStr.Split('\\'); 
string dir = paths[paths.Length - 2]; //returns "foo" 

Questo non controlla l'eccezione di un array fuori limite, ma si ottiene l'idea.

+0

Questo fallirà su Linux. – JensG

+0

Path.DirectorySeparatorChar – Ruudjah

7

Penso soluzione più semplice è

 
DirectoryInfo dinfo = new DirectoryInfo(path); 

string folderName= dinfo.Parent.Name; 
3

Costruire su suggerimento di Handleman, si può fare:

Path.GetFileName(Path.GetDirectoryName(path)) 

Questo non tocca il filesystem (a differenza FileInfo), e farà ciò che è necessario . Questo funziona con le cartelle perché, come il MSDN dice:

Valore restituito: I caratteri dopo l'ultimo carattere directory in cammino. Se l'ultimo carattere di percorso è un carattere di separatore di directory o di volume, questo metodo restituisce String.Empty. Se path è null, questo metodo restituisce null.

Inoltre, guardando il reference source conferma che GetFilename non importa se il percorso passato è un file o una cartella: è solo facendo la manipolazione di stringhe puro.

Problemi correlati