Отримайте (останню частину) поточного імені каталогу в 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 #?

ДОБАВЛЕНО

За допомогою відповідей я знайшов те, що мені потрібно.

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


1
У python вам слід скоріше робити os.path.basename(path).
ReneSac

Відповіді:


132

Ви шукаєте Path.GetFileName.
Зауважте, що це не буде працювати, якщо шлях закінчується в a \.


3
@anti: Неправильно; Я спробував це. Струни - це струнні. Вставте Path.GetFileName("/Users/smcho/filegen_from_directory/AIRPassthrough")в LINQPad, якщо ви мені не вірите.
СЛАкс

@antisanity Ні, воно поверне ім'я каталогів, але це, мабуть, не саме питання.
Jakob Möllås

@Jakob: Враховуючи назву, я думаю, що це питання.
СЛАкс

3
@Light: це працює; Спробуй це. PathКлас обробляє обидва роздільник.
СЛАкс

31
Щоб мати цю роботу з каталогом, отриманим Directory.GetDirectories, використовуйте: string directoryName = Path.GetFileName (directory.TrimEnd (Path.DirectorySeparatorChar));
Фатлад

185

Ви можете спробувати:

var path = @"/Users/smcho/filegen_from_directory/AIRPassthrough/";
var dirName = new DirectoryInfo(path).Name;

20
Мені це подобається більше, ніж обрана відповідь. (Ab) використання GetFileName семантично неправильно, оскільки це каталог, який ви намагаєтеся отримати. Крім того, щоб зробити GetFileName детермінованими засобами, вам доведеться враховувати можливість останньої косої риски або зворотної косої риси, і обрізати її, що некрасиво.
Саймон Брангвін

var dirName = новий DirectoryInfo (Path.GetDirectoryName (pathWithFilename)). Ім'я // краще
kernowcode

@kernowcode Я вважаю, що повернеться "filegen_from_directory" замість "AIRPassthrough", як цього вимагає ОП.
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"


8

замість того, щоб використовувати "/" для дзвінка, щоб розділити, краще використовувати Path.DirectorySeparatorChar :

так:

path.split(Path.DirectorySeparatorChar).Last() 

1
Одне, що мені не подобається у використанні цього рішення, це те, що він робить припущення про те, звідки береться рядок. Що робити, якщо вони читають журнали * nix в системі Windows? Тоді неправильний символ буде використаний, і ви закінчите весь шлях, а не намічений ефект. Всього мої 2 копійки.
Боб Г

Я згоден з вами з цього приводу. ОП сказала "остання частина поточного каталогу", тому для цього це добре.
Muad'Dib

6
var lastFolderName = Path.GetFileName(
    path.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar));

Це спрацьовує, якщо траєкторія містить передні косої риски або роздільники зворотної косої риски.


1
Це схоже на string.TrimEnd () приймає кілька символів, тому не потрібно використовувати кілька дзвінків. msdn.microsoft.com/en-us/library/…
Кайл Делані

1
@KyleDelaney так це і робиться! Відповідь скоригована.
Гольф

1
Це масив params, тому він .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());

Код може бути відключений (я його не перевіряв), але ідея повинна спрацювати




0

Ви також можете використовувати клас Uri.

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

Ви можете скористатися цим класом, якщо ви хочете отримати якийсь інший сегмент, або якщо ви хочете зробити те ж саме з веб-адресою.

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