Wenn ich ein String-Variable, die hat:Parsen Verzeichnisnamen von einem vollständigen Dateipfad in C#
"C:\temp\temp2\foo\bar.txt"
und ich mag
"foo"
bekommen, was das Beste ist, Weg, dies zu tun?
Wenn ich ein String-Variable, die hat:Parsen Verzeichnisnamen von einem vollständigen Dateipfad in C#
"C:\temp\temp2\foo\bar.txt"
und ich mag
"foo"
bekommen, was das Beste ist, Weg, dies zu tun?
Verwendung:
new FileInfo(@"C:\temp\temp2\foo\bar.txt").Directory.Name
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.
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 ... –
Ich lernte zwei Dinge heute ... Lesen Sie die Frage und widerspreche niemals dem Skeet. – Handleman
Funktioniert Path.getDirectoryName nicht genau, was er will? –
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);
+1 Ich mache fast genau das gleiche ... – SMUsamaShah
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.
Ich denke, die einfachste Lösung ist
DirectoryInfo dinfo = new DirectoryInfo(path); string folderName= dinfo.Parent.Name;
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.
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
@GuiSim: Nicht dass ich mir dessen bewusst bin. –
Falls jemand den vollständigen Verzeichnispfad benötigt, verwenden Sie 'new FileInfo (@" C: \ temp \ temp2 \ foo \ bar.txt "). Stattdessen" DirectoryName ". –