Objective-C: Витягнути ім'я файлу з рядка шляху


251

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

Який найпростіший спосіб зробити це?


4
[шлях 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](використовуйте будь-який файловий менеджер). Це гарантує коректну локалізацію імені файлу та розширення було видалено.
10

1
Дуже дякую! Це дуже допомогло! Як би ви ПРОСТО отримали розширення?

20
@TwoDumplingNSString *myExtension = [myString pathExtension]
chown

Гей, це зовсім небагато після цієї дискусії, але мені просто цікаво щось. Як би я змінив цю дію? Я врешті додаю код до своєї програми, куди я можу перетягнути файл і перетягнути його. Як отримати ПАТУ, щоб мій комп'ютер міг знати, до якого файлу отримати доступ? Як мені взяти введений файл і отримати шлях до файлу?
Крістіан Крейтер

37

Якщо відображається ім'я файлу, прочитане користувачем, його не потрібно використовувати lastPathComponent. Замість цього пройдіть повний шлях до displayNameAtPath:методу NSFileManager . В основному це робить те ж саме, тільки він правильно локалізує ім'я файлу та видаляє розширення, виходячи з уподобань користувача.


1
Для пакетів ви можете використовувати замість [[[[NSBundle bundleWithPath: pref] localizedInfoDictionary] objectForKey: @ "CFBundleName"]. displayNameAtPath включає розширення, де цей код повертає локалізовану назву.
Пітер Н Льюїс

1
Не забудьте спочатку перевірити CFBundleDisplayName.
Пітер Хосей

3

Загрожуючи запізнитись на роки і поза темою - і незважаючи на відмінну прозорливість @ Марка, у Swift це виглядає так:

let basename = NSURL(string: "path/to/file.ext")?.URLByDeletingPathExtension?.lastPathComponent
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.