Подтвердить что ты не робот

Разбирайте имя каталога из полного пути к файлу в С#

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

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

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

"Foo"

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

Я думаю, что наиболее простым решением является

DirectoryInfo dinfo = new DirectoryInfo(path);

string folderName= dinfo.Parent.Name;

Ответ 4

Создавая предложение Handleman, вы можете сделать:

Path.GetFileName(Path.GetDirectoryName(path))

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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