Разобрать имя каталога из полного пути к файлу в C # - PullRequest
35 голосов
/ 19 марта 2009

Если у меня есть строковая переменная, которая имеет:

"C:\temp\temp2\foo\bar.txt"

и я хочу получить

"Foo"

Каков наилучший способ сделать это?

Ответы [ 6 ]

73 голосов
/ 19 марта 2009

Использование:

new FileInfo(@"C:\temp\temp2\foo\bar.txt").Directory.Name
8 голосов
/ 19 марта 2009

Я не согласен со Скитом, но я всегда использовал

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

Я подозреваю, что FileInfo на самом деле касается файловой системы, чтобы получить ее информацию, где, как и следовало ожидать, GetFileNameWithoutExtension - это только строковые операции, поэтому производительность одной над другой может быть лучше.

7 голосов
/ 24 июля 2010

Я думаю, что самое простое решение -

DirectoryInfo dinfo = new DirectoryInfo(path);

string folderName= dinfo.Parent.Name;
3 голосов
/ 18 февраля 2016

Основываясь на предложении Хендлмана, вы можете сделать:

Path.GetFileName(Path.GetDirectoryName(path))

Это не касается файловой системы (в отличие от FileInfo) и будет делать то, что требуется. Это будет работать с папками, потому что, как говорит MSDN :

Возвращаемое значение: Символы после последнего символа каталога в пути. Если последний символ пути является символом разделителя каталога или тома, это метод возвращает String.Empty. Если путь равен нулю, этот метод возвращает нуль.

Кроме того, просмотр справочного источника подтверждает, что GetFilename не волнует, является ли переданный путь файлом или папкой: он просто выполняет чисто строковые манипуляции.

2 голосов
/ 09 октября 2009

У меня был случай, когда я просматривал родительские дочерние каталоги

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);
1 голос
/ 10 ноября 2009

Это будет зависеть от того, как вы хотите обрабатывать данные, но другой вариант - использовать String.Split.

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

Это не проверяет исключение массива за пределами границ, но вы поняли идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...