Получить имя папки из полного пути к файлу


116

Как получить имя папки из полного пути к приложению?

Это путь к файлу ниже,

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

Здесь «текст» - это имя папки.

Как я могу получить это имя папки по этому пути?

Ответы:


205

См. DirectoryInfo.Name :

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

Разве для этого не требуется, чтобы папка действительно существовала в файловой системе (имя папки все равно будет "text" для этого полного пути к файлу, если папка "c: \ projects \ root \ wsdlproj \ devlop \ beta2 \ text" не ( в настоящее время) существуют в файловой системе)?
Питер Мортенсен

@PeterMortensen, нет. Я только что проверил это, и метод возвращает имя папки самого низкого уровня из строки, даже если путь к папке не существует.
vbguyny 05

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 08

1
В данном случае текст - это имя файла (без расширения). Я думал, что это было то, что нужно было OP. Если это папка или имя файла, не имеет значения. Если строка не содержит имени файла, этот код даст ему то, что ему нужно.
Øyvind Bråthen

4
Если пути не заканчиваются \, как это:@"c:\projects\roott\wsdlproj\devlop\beta2\text\"
Kristof Claes

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 08

1
@Alex - Я изменил свой код, чтобы он работал и с такими путями. StringSplitOptions.RemoveEmptyEntriesделает свое дело.
Кристоф Клаас

Согласно msdn.microsoft.com/en-us/library/… , FileInfo может вызвать исключение, если не предоставлено необходимое разрешение.
Daniel B

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 - только что протестирован с помощью ScriptCs, и он возвращает «текст»
Стив Купер,

2
Это прекрасно работает, если путь к папке не содержит обратной косой черты в конце (например, путь к папке, возвращенный из Path.GetDirectoryName () ). Однако имя этой функции, GetFileName (), немного вводит в заблуждение.
Питер Мортенсен

0

На основе предыдущих ответов (но исправлено)

using static System.IO.Path;

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

Объяснение GetFileNameиз источника .NET :

Возвращает имя и расширение заданного пути. Результирующая строка содержит символы пути, следующие за последней обратной косой чертой ("\"), косой чертой ("/") или двоеточием (":") в пути. Результирующая строка представляет собой весь путь, если путь не содержит обратной косой черты после удаления завершающих косых черт, косой черты или символов двоеточия. Результирующая строка имеет значение NULL, если значение path равно NULL.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.