2009-03-19 8 views

Antwort

71

Verwendung:

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

Nach http://msdn.microsoft.com/en-us/library/system.io.fileinfo.fileinfo.aspx kann der FileInfo-Konstruktor auslösen, wenn der Aufrufer nicht die erforderliche Berechtigung hat. Gibt es eine Alternative, die die Zeichenfolge nur ohne IO analysiert? – GuiSim

+0

@GuiSim: Nicht dass ich mir dessen bewusst bin. –

+10

Falls jemand den vollständigen Verzeichnispfad benötigt, verwenden Sie 'new FileInfo (@" C: \ temp \ temp2 \ foo \ bar.txt "). Stattdessen" DirectoryName ". –

7

Far es für mich, mit dem Skeet anderer Meinung zu sein, aber ich habe immer verwendet

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

Ich vermute, dass Fileinfo, das Dateisystem tatsächlich berührt, es zu bekommen Info , wo ich erwarten würde, dass GetFileNameWithoutExtension nur String-Operationen ist - also könnte die Performance der einen gegenüber der anderen besser sein.

+0

Es gibt einen kleinen Unterschied in den Ergebnissen hier ... Ich denke, Ihr Ansatz gibt "bar" zurück, wenn die Frage fragt, wie man "foo" die Datei enthält Verzeichnis ... –

+7

Ich lernte zwei Dinge heute ... Lesen Sie die Frage und widerspreche niemals dem Skeet. – Handleman

+2

Funktioniert Path.getDirectoryName nicht genau, was er will? –

2

hatte ich eine Gelegenheit, wenn ich durch die Verzeichnisse Kind Eltern wurde Looping

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

diese Linie mit ich in der Lage war, nur den aktuellen Verzeichnisnamen auf, wie Sie

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

+1 Ich mache fast genau das gleiche ... – SMUsamaShah

1

Es wird abhängig zu bekommen möchte mit den Daten umgehen, aber eine andere Option ist die Verwendung von String.Split.

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

Dies überprüft nicht für eine Array außerhalb der Grenzen Ausnahme, aber Sie bekommen die Idee.

+0

Das wird unter Linux scheitern. – JensG

+0

Pfad.DirectorySeparatorChar – Ruudjah

7

Ich denke, die einfachste Lösung ist

 
DirectoryInfo dinfo = new DirectoryInfo(path); 

string folderName= dinfo.Parent.Name; 
3

Aufbauend auf Handleman Vorschlag, können Sie tun:

Path.GetFileName(Path.GetDirectoryName(path)) 

Dies berührt nicht das Dateisystem (im Gegensatz zu FileInfo), und tun, was erforderlich ist . Dies wird mit Ordnern arbeiten, weil, wie die MSDN sagt:

Rückgabewert: Die Zeichen nach den letzten Verzeichnis Zeichen in Pfad. Wenn das letzte Zeichen des Pfads ein Verzeichnis- oder Volume-Trennzeichen ist, gibt diese Methode String.Empty zurück. Wenn path null ist, gibt diese Methode null zurück.

Auch am reference source Suche bestätigt, dass GetFilename nicht schert, wenn der übergebene Pfad eine Datei oder ein Ordner ist: es ist nur reine String-Manipulation zu tun.

Verwandte Themen