Objective-C: извлечь имя файла из строки пути

251

Когда я NSStringс /Users/user/Projects/thefile.extя хочу , чтобы извлечь thefileс помощью методов Objective-C.

Какой самый простой способ сделать это?

Антон
источник
4
[path lastPathComponent] или [[path pathComponents] lastObject]. Оба дают «thefile.ext». Существует метод [path pathExtension] для получения 'ext', но он не совпадает с именем файла.
Антон

Ответы:

598

Взято из ссылки NSString , вы можете использовать:

NSString *theFileName = [[string lastPathComponent] stringByDeletingPathExtension];

lastPathComponentВызов вернется thefile.ext, и stringByDeletingPathExtensionбудет удалить суффикс расширения с конца.

Питер
источник
9
Я никогда не слышал о lastPathComponent. Спасибо!
Димитрис
6
Другим решением было бы сочетание этого и ответов Марка: [[[NSFileManager defaultManager] displayNameAtPath:path] stringByDeletingPathExtension](используйте любой файловый менеджер, который вы хотите). Это гарантирует, что имя файла правильно локализовано, и что расширение было удалено.
Willurd
1
Спасибо вам большое! Это очень помогло! Как бы вы только что получили расширение?
20
@TwoDumplingNSString *myExtension = [myString pathExtension]
Чаун
Эй, это немного после этой дискуссии, но мне просто интересно кое-что. Как бы я отменить это действие? В конце концов я добавлю код в свою программу, куда я смогу перетащить файл. Как мне получить ПУТЬ СЕБЯ, чтобы мой компьютер мог знать, к какому файлу получить доступ? Как мне взять введенный файл и получить путь к файлу?
Кристиан Крейтер
37

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

Марк Шарбонно
источник
1
Для пакетов вы можете вместо этого использовать [[[NSBundle bundleWithPath: pref] localizedInfoDictionary] objectForKey: @ "CFBundleName"]. displayNameAtPath включает расширение, где этот код возвращает локализованное имя.
Питер Н Льюис
1
Не забудьте сначала проверить CFBundleDisplayName.
Питер Хоси
3

С риском опоздания на годы и не по теме - и, несмотря на превосходную проницательность @ Marc, в Swift это выглядит так:

let basename = NSURL(string: "path/to/file.ext")?.URLByDeletingPathExtension?.lastPathComponent
Крис Коновер
источник