Получить (последняя часть) имя текущего каталога в C #

158

Мне нужно получить последнюю часть текущего каталога, например, из /Users/smcho/filegen_from_directory/AIRPassthrough, я должен получить AIRPassthrough.

С Python я могу получить это с помощью этого кода.

import os.path

path = "/Users/smcho/filegen_from_directory/AIRPassthrough"
print os.path.split(path)[-1]

Или

print os.path.basename(path)

Как я могу сделать то же самое с C #?

ADDED

С помощью ответчиков я нашел то, что мне было нужно.

using System.Linq;
string fullPath = Path.GetFullPath(fullPath).TrimEnd(Path.DirectorySeparatorChar);
string projectName  = fullPath.Split(Path.DirectorySeparatorChar).Last();

или

string fullPath = Path.GetFullPath(fullPath).TrimEnd(Path.DirectorySeparatorChar);
string projectName = Path.GetFileName(fullPath);
prosseek
источник
1
В питоне вы должны делать это os.path.basename(path).
ReneSac

Ответы:

133

Ты ищешь Path.GetFileName.
Обратите внимание, что это не будет работать, если путь заканчивается на \.

SLaks
источник
3
@anti: неправильно; Я попробовал это. Строки - это строки. Вставьте Path.GetFileName("/Users/smcho/filegen_from_directory/AIRPassthrough")в LINQPad, если вы мне не верите.
SLaks
@antisanity Нет, он вернет имя каталога, но, вероятно, это не совсем то, о чем был вопрос.
Якоб Меллос
@Jakob: Учитывая название, я думаю, что это вопрос.
SLaks
3
@Light: это работает; попытайся. PathКласс обрабатывает оба разделителя.
SLaks
31
Чтобы выполнить эту работу с каталогом, полученным с помощью Directory.GetDirectories, используйте: string directoryName = Path.GetFileName (directory.TrimEnd (Path.DirectorySeparatorChar));
Фатлад
186

Вы можете попробовать:

var path = @"/Users/smcho/filegen_from_directory/AIRPassthrough/";
var dirName = new DirectoryInfo(path).Name;
codybartfast
источник
20
Мне нравится это лучше, чем выбранный ответ. (Ab) использование GetFileName семантически неверно, так как это каталог, который вы пытаетесь получить. Кроме того, чтобы сделать GetFileName детерминированным, вы должны учитывать возможность обратной косой черты или обратной косой черты и обрезать ее, что ужасно.
Саймон Брангвин
var dirName = new DirectoryInfo (Path.GetDirectoryName (pathWithFilename)). Имя // лучше
kernowcode
@kernowcode Я полагаю, что вместо запроса «AIRPassthrough» будет возвращено «filegen_from_directory», как того требует OP.
codybartfast
1
@SimonBrangwin Я думал, что все это файл в Linux :)
Razor
12

Ну, чтобы точно ответить на ваш вопрос заголовок :-)

var lastPartOfCurrentDirectoryName = 
   Path.GetFileName(Environment.CurrentDirectory);
Якоб Меллос
источник
12

Это немного другой ответ, в зависимости от того, что у вас есть. Если у вас есть список файлов и вам нужно получить имя последнего каталога, в котором находится файл, вы можете сделать это:

string path = "/attachments/1828_clientid/2938_parentid/somefiles.docx";
string result = new DirectoryInfo(path).Parent.Name;

Это вернет "2938_parentid"

ProVega
источник
8

вместо того, чтобы использовать '/' для вызова split, лучше использовать Path.DirectorySeparatorChar:

вот так:

path.split(Path.DirectorySeparatorChar).Last() 
Муад'Диб
источник
1
Что мне не нравится в этом решении, так это то, что оно делает предположение о том, откуда берется строка. Что если они читают журналы * nix в системе Windows? Тогда будет использован неправильный персонаж, и вы получите весь путь, а не предполагаемый эффект. Просто мои 2 цента.
Боб Г
Я согласен с вами в этом. ОП сказал «последняя часть текущего каталога», так что для этого все нормально.
Муад'Диб
6
var lastFolderName = Path.GetFileName(
    path.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar));

Это работает, если путь содержит разделители с прямой или обратной косой чертой.

Holf
источник
1
Это похоже на string.TrimEnd () принимает несколько символов, поэтому нет необходимости использовать несколько вызовов. msdn.microsoft.com/en-us/library/…
Кайл Делани
1
@KyleDelaney так оно и есть! Ответ скорректирован.
Холф
1
Это массив параметров, поэтому .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)тоже работает.
Кайл Делани
1
Примененное расположение .TrimEnd () неверно. Это должно быть применено к пути , а не Path.GetFileName . Смотрите ответ от @Fatlad
Тони
2

Попробуй это:

String newString = "";
Sting oldString = "/Users/smcho/filegen_from_directory/AIRPassthrough";

int indexOfLastSlash = oldString.LastIndexOf('/', 0, oldString.length());

newString = oldString.subString(indexOfLastSlash, oldString.length());

Код может быть отключен (я не проверял его), но идея должна работать

Кубок Стэнли Фила
источник
1

Это прекрасно работает со мной :)

Path.GetFileName(path.TrimEnd('\\')
Акшай
источник
0

Вы можете попробовать ниже код:

Path.GetFileName(userpath)

Code_Beginner
источник
0

Вы также можете использовать класс Uri.

new Uri("file:///Users/smcho/filegen_from_directory/AIRPassthrough").Segments.Last()

Вы можете предпочесть использовать этот класс, если вы хотите получить какой-то другой сегмент, или если вы хотите сделать то же самое с веб-адресом.

Крис
источник