iPhone: получить путь к файлу, который находится в подпапке папки ресурсов.

Я новичок в программировании для iPhone. Я хочу прочитать содержимое текстового файла, расположенного в подпапке папки ресурсов.

Структура папок ресурсов следующая:

Ресурс

  1. Папка1---->Data.txt
  2. Папка2---->Data.txt
  3. Папка3---->Папка1---->Data.txt

Существует несколько файлов с именем «Data.txt», так как я могу получить доступ к файлам в каждой папке? Я знаю, как читать текстовый файл, но если структура ресурса аналогична приведенной выше структуре, то как я могу получить путь?

Например, если я хочу получить доступ к файлу «Data.txt» из Folder3, как я могу получить путь к файлу?

Пожалуйста, предложите.


person Rupesh    schedule 30.09.2009    source источник


Ответы (4)


Чтобы продолжить ответ психотиков, полный пример будет выглядеть так:

NSBundle *thisBundle = [NSBundle bundleForClass:[self class]];
NSString *filePath = nil;

if (filePath = [thisBundle pathForResource:@"Data" ofType:@"txt" inDirectory:@"Folder1"])  {

    theContents = [[NSString alloc] initWithContentsOfFile:filePath];

    // when completed, it is the developer's responsibility to release theContents

}

Обратите внимание, что вы можете использовать -pathForResource:ofType:inDirectory для доступа к ресурсам в подкаталогах.

person Shirkrin    schedule 30.09.2009
comment
Но есть несколько папок с одинаковым именем в разных папках. так в этом случае, как можно достичь пути - person Rupesh; 30.09.2009
comment
@Rupesh: для второй папки вам нужно будет использовать: [thisBundle pathForResource:@"Data" ofType:@"txt" inDirectory:@"Folder3/Folder1"]. Обратите внимание, что аргумент inDirectory: относится к корню пакета. - person PeyloW; 30.09.2009
comment
Вы действительно должны использовать [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL], таким образом память управляется, и, что более важно, initWithContentsOfFile: устарело, начиная с Mac OS X 10.4, и недоступно в iPhone OS. Так что код будет работать только в симуляторе. - person PeyloW; 30.09.2009
comment
@Peylow - я с тобой согласен. Пример представляет собой модифицированную версию из документации NSBundle, в которой не используются пулы авторелазирования. - person Shirkrin; 30.09.2009
comment
@PeyloW - Хотя initWithContentsOfURL действительно устарел, Apple сделала это просто для того, чтобы потребовать от вас указать кодировку (мудрый шаг с их стороны). Таким образом, метод initWithContentsOfURL:encoding:error: доступен в iOS 2.0 и более поздних версиях (по крайней мере, в iOS 5.1). - person Basil Bourque; 20.10.2012
comment
Что делать, если я хочу получить все файлы в папке, похоже, это не работает.... NSString *inWorkPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@In-Work]; NSArray *resContents = [[NSFileManager defaultManager] contentOfDirectoryAtPath: ошибка inWorkPath: & error]; - person Eshwar Chaitanya; 24.12.2014

Ваша "папка ресурсов" на самом деле является содержимым вашего основного пакета, также известного как пакет приложений. Вы используете pathForResource:ofType: или pathForResource:ofType:inDirectory:, чтобы получить полный путь к ресурсу.

Загрузка содержимого файла в виде строки выполняется с помощью метода stringWithContentsOfFile:encoding:error: для автоматически выпущенной строки или с помощью initWithContentsOfFile:encoding:error:, если вы хотите сохранить строку.

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Data" 
                                                     ofType:@"txt"
                                                inDirectory:@"Folder1"];
if (filePath != nil) {
  theContents = [NSString stringWithContentsOfFile:filePath
                                          encoding:NSUTF8StringEncoding
                                             error:NULL];
  // Do stuff to theContents
}

Это почти тот же ответ, который ранее давал Ширкрин, но с небольшой разницей, что он работает на цель. Это связано с тем, что initWithContentsOfFile: устарела в Mac OS X и недоступна для всех iPhone OS.

person PeyloW    schedule 30.09.2009

ответ Ширкрина и ответ PeyloW выше были полезны, и мне удалось использовать pathForResource:ofType:inDirectory: для доступа к файлам с тем же именем в разных папках в моем комплекте приложений.

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

Например, скажем, у меня есть следующие ссылки на папки (синие значки, группы желтые):

введите здесь описание изображения

Затем я могу получить доступ к файлам изображений следующим образом:

NSString * filePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"pin_images/1/2.jpg"];
UIImage * image = [UIImage imageWithContentsOfFile:filePath];

В качестве примечания, эквивалент pathForResource:ofType:inDirectory: выглядит так:

NSString * filePath = [[NSBundle mainBundle] pathForResource:@"2" ofType:@"jpg" inDirectory:@"pin_images/1/"];
person Steph Sharp    schedule 09.08.2013

    NSBundle* bundle = [NSBundle mainBundle];
    NSString* path = [bundle bundlePath];

Это дает вам путь к вашему пакету. Оттуда вы можете перемещаться по структуре папок.

person psychotik    schedule 30.09.2009