Если у меня есть строковая переменная, которая имеет:
"C:\temp\temp2\foo\bar.txt"
и я хочу получить
"Foo"
Каков наилучший способ сделать это?
Если у меня есть строковая переменная, которая имеет:
"C:\temp\temp2\foo\bar.txt"
и я хочу получить
"Foo"
Каков наилучший способ сделать это?
Использование:
new FileInfo(@"C:\temp\temp2\foo\bar.txt").Directory.Name
Дай мне не согласиться с Скитом, но я всегда использовал
Path.GetFileNameWithoutExtension(@"C:\temp\temp2\foo\bar.txt")
Я подозреваю, что FileInfo фактически затрагивает файловую систему, чтобы получить информацию, где, как я ожидал бы, GetFileNameWithoutExtension - это только операции с строкой, поэтому производительность одного над другим может быть лучше.
Я думаю, что наиболее простым решением является
DirectoryInfo dinfo = new DirectoryInfo(path); string folderName= dinfo.Parent.Name;
Создавая предложение Handleman, вы можете сделать:
Path.GetFileName(Path.GetDirectoryName(path))
Это не касается файловой системы (в отличие от FileInfo
) и будет делать то, что требуется. Это будет работать с папками, потому что, поскольку MSDN говорит:
Возвращаемое значение: Символы после последнего символа каталога в пути. Если последний Характер пути - это каталог или разделитель томов, этот метод возвращает String.Empty. Если путь равен null, этот метод возвращает нуль.
Также, глядя на источник ссылки, подтверждает, что GetFilename
не интересует, прошел ли путь в файл или папку: он просто выполняет чистую манипуляцию строк.
У меня был случай, когда я перебирал родительские дочерние каталоги
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);
}
}
}
}
используя эту строку, мне удалось получить только текущее имя каталога
DirectoryInfo info = new DirectoryInfo(year);
Console.WriteLine(info.Name);
Это будет зависеть от того, как вы хотите обрабатывать данные, но другой вариант - использовать String.Split.
string myStr = @"C:\foo\bar.txt";
string[] paths = myStr.Split('\\');
string dir = paths[paths.Length - 2]; //returns "foo"
Это не проверяет исключение массива вне пределов, но вы получаете идею.