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