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


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.