Se ho una variabile stringa che ha:Parse nome della directory da un percorso file completo in C#
"C:\temp\temp2\foo\bar.txt"
e voglio ottenere
"pippo"
qual è la migliore modo di fare questo?
Se ho una variabile stringa che ha:Parse nome della directory da un percorso file completo in C#
"C:\temp\temp2\foo\bar.txt"
e voglio ottenere
"pippo"
qual è la migliore modo di fare questo?
Usa:
new FileInfo(@"C:\temp\temp2\foo\bar.txt").Directory.Name
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.
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 ... –
Ho imparato due cose oggi ... Leggi la domanda e mai in disaccordo con lo Skeet. – Handleman
Does Path.getDirectoryName non fa esattamente ciò che vuole? –
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);
+1 Sto facendo quasi esattamente lo stesso ... – SMUsamaShah
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.
Penso soluzione più semplice è
DirectoryInfo dinfo = new DirectoryInfo(path); string folderName= dinfo.Parent.Name;
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.
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
@GuiSim: non che io sappia. –
Nel caso in cui qualcuno abbia bisogno del percorso completo della directory, usare 'new FileInfo (@" C: \ temp \ temp2 \ foo \ bar.txt "). DirectoryName' invece. –