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

#iphone #objective-c #ios #xcode #bundle

#iPhone #objective-c #iOS #xcode #пакет

Вопрос:

Я хочу добавить некоторые статические файлы (изображения, двоичные файлы и т. Д.) В свое приложение. Я поместил их в папку с именем 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, пожалуйста, помогите, я могу получить доступ к своим локальным файлам! Любая помощь будет оценена.

Спасибо,

Комментарии:

1. Правильно ли указан регистр? iOS чувствительна к регистру, поэтому Data.BIN и data.bin являются двумя разными файлами.

Ответ №1:

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

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

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

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

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

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

Для начала найдите «Руководство по программированию пакетов» в библиотеке документации Xcode. 🙂

Комментарии:

1. Если вы получаете ошибки, используя приведенный выше код (например, возвращаете nil для myFile), найдите свой пакет приложений в каталоге сборки Xcode, щелкните его правой кнопкой мыши (чтобы просмотреть его содержимое) и посмотрите, действительно ли Xcode поместил туда файл «data.bin». 🙂

2. действительно, это вернуло мне ноль, потому pathForResource что я удалил все свои ресурсы и добавил их обратно с нуля. каков наилучший способ добавления пакетов? должен ли я щелкнуть правой кнопкой мыши по проекту и выполнить Add Files to <project.name>?

3. Вы должны просто иметь возможность использовать кнопку » » в разделе «Копировать ресурсы пакета» в настройках этапов сборки для вашей цели. Опять же, если вы хотите увидеть, что Xcode делает за кулисами, используйте Finder, чтобы перейти ~/Library/Developer/Xcode/DerrivedData/{random lowercase letters} name}/Build/Products/Debug-iphonesimulator и заглянуть внутрь файла «.app». Это ваш пакет, и в нем должны быть файлы, которые вы просили Xcode скопировать.

4. Спасибо, вы правильно указали путь… но по-прежнему не повезло с созданием действительного NSInputStream

5. nvm забыл позвонить [is open] после инициализации, ха-ха 😉 Большое спасибо!

Ответ №2:

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

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

Комментарии:

1. Я получаю *** Завершение работы приложения из-за неперехваченного исключения ‘NSInvalidArgumentException’, причина: ‘*** -[NSURL initFileURLWithPath:]: строковый параметр nil’ *** Первый стек вызовов throw:

Ответ №3:

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