Отримати ім'я папки з повного шляху до файлу


116

Як отримати ім'я папки з повного шляху програми?

Це шлях до файлу нижче,

c:\projects\root\wsdlproj\devlop\beta2\text

Тут "текст" - це назва папки.

Як я можу отримати це ім'я папки з цього шляху?

Відповіді:


205

Дивіться DirectoryInfo.Name :

string dirName = new DirectoryInfo(@"c:\projects\roott\wsdlproj\devlop\beta2\text").Name;

Чи не вимагає цього папка насправді існує у файловій системі (ім'я папки все одно буде "текстом" для цього повного шляху до файлу, якщо папка "c: \ proje \ root \ wsdlproj \ devlop \ beta2 \ text" не ( в даний час) існують у файловій системі)?
— Пітер Мортенсен

@PeterMortensen, ні. Я щойно перевірив це, і метод повертає ім'я папки найнижчого рівня з рядка, навіть якщо шлях до папки не існує.
— vbguyny

1
Дякую, чудова відповідь. Але я трохи спантеличений тим, що System.IO.Directory не підтримує таку операцію.
— anhoppe

1
@anhoppe - я згоден. Ще один варіант, який я бачив, - це Path.GetDirectoryName msdn.microsoft.com/en-us/library/… - але він не зможе перевірити його до завтра.
— Дон Чіддл

30

Я думаю, ви хочете отримати ім'я батьківської папки з файлу шляху. Це легко дістати. Один із способів - створити об’єкт FileInfoтипу та використовувати його Directoryвластивість.

Приклад:

FileInfo fInfo = new FileInfo("c:\projects\roott\wsdlproj\devlop\beta2\text\abc.txt");

String dirName = fInfo.Directory.Name;

16

Спробуйте це

var myFolderName = @"c:\projects\roott\wsdlproj\devlop\beta2\text";
var result = Path.GetFileName(myFolderName);

якщо у вас є ім'я файлу в рядку, воно також повертає ім'я файлу
— swissben

1
У цьому випадку текст є ім'ям файлу (без розширення). Я подумав, що це було те, що ОП після цього. Якщо це папка чи ім'я файлу, насправді не має значення. Якщо рядок не містить імені файлу, цей код дасть йому те, що він шукає.
— Øyvind Bråthen

4
Якщо тільки шляхи не закінчуються так, як це:@"c:\projects\roott\wsdlproj\devlop\beta2\text\"
— Крістоф Клайс

1
це не працює для папки. Я отримую порожню рядок. Має бути присутнім файл
— BraveNewMath

3
Це працює чудово, якщо шлях до папки не містить зворотної косої риси (наприклад, шлях до папки, повернутий з Path.GetDirectoryName () ). Назва цієї функції, GetFileName (), дещо вводить в оману.
— Пітер Мортенсен

9

Ви можете скористатися цим:

string path = @"c:\projects\roott\wsdlproj\devlop\beta2\text";
string lastDirectory = path.Split(new char[] { System.IO.Path.DirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries).Last();

що робити, якщо шлях виглядає так: @ "c: \ projects \ roott \ wsdlproj \ devlop \ beta2 \ text \", тож із додатковим DirectorySeparatorChar
— Alex Pacurar

1
@Alex - я змінив свій код, щоб він також працював з такими шляхами. StringSplitOptions.RemoveEmptyEntriesробить трюк.
— Крістоф Клайс

Згідно з повідомленням msdn.microsoft.com/en-us/library/… , FileInfo може викинути виняток, якщо необхідний дозвіл не надано.
— Даніель Б

5

Просто використовуйте Path.GetFileName

Тут - Вилучення назви папки з повного шляху папки:

string folderName = Path.GetFileName(@"c:\projects\root\wsdlproj\devlop\beta2\text");//Return "text"

Ось кілька додаткових назв папки з повного шляху файлу:

string folderName = Path.GetFileName(Path.GetDirectoryName(@"c:\projects\root\wsdlproj\devlop\beta2\text\GTA.exe"));//Return "text"

3

Я зрозумів, що немає іншого способу, окрім заходу у файлову систему, щоб дізнатися, чи text.txt - це каталог чи просто файл. Якщо ви хотіли чогось простого, можливо, ви можете просто скористатися:

s.Substring(s.LastIndexOf(@"\"));

1
Щоб уникнути косої риски на передній частині рядка: s.Substring (s.LastIndexOf (@ "\") + 1);
— Девід Йейтс

2

У цьому випадку файл, який ви хочете отримати, зберігається у змінній strpath:

string strPath = Server.MapPath(Request.ApplicationPath) + "/contents/member/" + strFileName;

2

Ось альтернативний метод, який працював для мене без створення об’єкта DirectoryInfo. Ключовим моментом є те, що GetFileName()працює, коли в шляху немає останньої косої риски.

var name = Path.GetFileName(path.TrimEnd(Path.DirectorySeparatorChar));

Приклад:

var list = Directory.EnumerateDirectories(path, "*")
        .Select(p => new
        {
            id = "id_" + p.GetHashCode().ToString("x"),
            text = Path.GetFileName(p.TrimEnd(Path.DirectorySeparatorChar)),
            icon = "fa fa-folder",
            children = true
        })
        .Distinct()
        .OrderBy(p => p.text);

1

Це також можна зробити так;

var directoryName = System.IO.Path.GetFileName(@"c:\projects\roott\wsdlproj\devlop\beta2\text");

це поверне порожню рядок
— disklosr

@disklosr - щойно тестується на ScriptC, і він повертає "текст"
— Стів Купер

2
Це працює чудово, якщо шлях до папки не містить зворотної косої риси (наприклад, шлях до папки, повернутий з Path.GetDirectoryName () ). Назва цієї функції, GetFileName (), дещо вводить в оману.
— Пітер Мортенсен

0

На основі попередніх відповідей (але виправлених)

using static System.IO.Path;

var dir = GetFileName(path?.TrimEnd(DirectorySeparatorChar, AltDirectorySeparatorChar));

Пояснення GetFileNameвід .NET джерела :

Повертає ім'я та розширення частини заданого шляху. Отриманий рядок містить символи шляху, які слідують за останньою косою косою рисою ("\"), косою косою рисою ("/") або двокрапкою (":"). Отриманий рядок - це весь шлях, якщо шлях не містить зворотньої косої риси після видалення знаків косої косої риски, косої риски або двокрапки. Отриманий рядок є null, якщо шлях є null.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.