Подтвердить что ты не робот

Как получить доступ к локальным файлам в рамках проекта

Я хочу добавить некоторые статические файлы (образ, двоичный и т.д.) В мое приложение. Я разместил их под папкой " Resources и добавил ее в свой проект XCode.

Затем у меня есть эти файлы, добавленные в Copy Bundle Resources на вкладке " Build Phases " в настройках проекта.

Тем не менее, я не могу сказать, что они правильно относятся к ним.

Например, чтение двоичного файла:

NSInputStream *is = [[NSInputStream alloc] initWithFileAtPath:@"data.bin"];
if(![is hasBytesAvailable]) NSLog(@"wrong");

Это всегда терпит неудачу и печатает wrong

Я пробовал аналогичный подход с NSData initWithContentsOfFile: но это даже не выполнялось. Другая попытка состояла в том, чтобы использовать [NSBundle mainBundle] но это также не выполнялось полностью.

Я новичок в iOS, помогите мне получить доступ к моим локальным файлам! Любая помощь будет оценена по достоинству.

Спасибо,

4b9b3361

Ответ 1

Вам необходимо убедиться, что вы получаете доступ к файлу в нужном месте. Xcode помещает ваши файлы ресурсов в приложение "пакет приложений" в каталоге " Ресурсы". Есть много способов выкопать их.

Обычный способ - получить путь к файлу в вашем комплекте:

NSBundle *mainBundle = [NSBundle mainBundle];
NSString *myFile = [mainBundle pathForResource: @"data" ofType: @"bin"];

Если у вас есть другие файлы в нестандартных местах вашего пакета, существуют варианты pathForResource, которые позволяют указать имя каталога.

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

NSLog(@"Main bundle path: %@", mainBundle);
NSLog(@"myFile path: %@", myFile);

Найдите "Руководство по программированию Bundle" в библиотеке документации Xcode, чтобы начать работу. :-)

Ответ 2

Для этого используйте класс NSBundle. Например:

NSString *path = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"bin"];
NSInputStream *is = [[NSInputStream alloc] initWithFileAtPath:path];
...

Ответ 3

Действительно, вызов [открыт] необходим, даже если вы "initialiseWithFileAtPath". Я бы подумал, что инициализация автоматически откроет файл для вас, но это не так.