Запись файла с помощью [NSBundle mainBundle] не выполняется

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

У меня есть база данных слов. Я хочу разделить слова на разные файлы на основе количества букв. Все четыре слова буквы входят в один файл и так далее. Я добавил txt файл под названием "4letter" в мои ресурсы, и следующий код:

NSError *error;

//READ
NSString *dbFile = [[NSBundle mainBundle] pathForResource:@"words" ofType:@"txt"];
NSString *test = [NSString stringWithContentsOfFile:dbFile encoding:NSUTF8StringEncoding error:&error];

//convert from string to array
NSArray *lines = [test componentsSeparatedByString:@"\n"]; 

NSFileHandle *logFile = nil;
logFile = [NSFileHandle fileHandleForWritingAtPath:[[NSBundle mainBundle] pathForResource:@"4letter" ofType:@"txt"]];

//Test if write works
for (int i=0; i<5; i++) 
{
    NSString *randomAnagram = [[lines objectAtIndex:i] lowercaseString];
    [logFile writeData: [randomAnagram dataUsingEncoding: NSNEXTSTEPStringEncoding]];
}

Ответы

Ответ 1

В iOS вы не можете записать файл в свой пакет приложений - весь комплект доступен только для чтения. Вместо этого используйте путь в папке "Документы".

Ответ 2

См. специальное Руководство по программированию файловой системы для лучшего понимания. В iOS вы не можете записать файл в свой пакет приложений - весь комплект доступен только для чтения.

Рассмотрите возможность читать Руководства по хранению данных iOS, чтобы лучше понять назначение каталогов ниже в контексте резервной копии iCloud.

< Application_Home > /AppName.app

Это каталог пакетов, содержащий приложение. Не пиши ничего в этом каталоге. Чтобы предотвратить несанкционированное вмешательство, каталог пакетов подписывается во время установки. Запись в этот каталог изменяет подпись и не позволяет вашему приложению снова запускаться.


< Application_Home > /Документы/

Используйте этот каталог для хранения важных документов пользователя и данных приложения файлы. Критические данные - это любые данные, которые невозможно воссоздать вашим приложением, таких как пользовательский контент. Содержимое этого каталога может быть доступный пользователю через общий доступ к файлам. Содержание этого каталог будет сохранен в iTunes.


< Application_Home > /Library/

Этот каталог является каталогом верхнего уровня для файлов, которые не являются пользователями Дата файлы. Обычно вы помещаете файлы в один из нескольких стандартных подкаталоги, но вы также можете создавать собственные подкаталоги для файлов вы хотите создать резервную копию, но не подвергаться воздействию пользователя. Вы не должны использовать этот каталог для файлов пользовательских данных. Содержимое этого каталога (за исключением подкаталога Caches) подкрепляются Itunes. Дополнительные сведения о каталоге библиотеки см. В разделе "Каталог библиотек хранит файлы приложений".

См. полный список (tmp/, Documents/Inbox) в Стандартные каталоги iOS: где хранятся файлы

ОБНОВЛЕНИЕ
Я использую метод NSFileManager URLForDirectory:inDomain:appropriateForURL:create:error:

Ответ 3

Как сказал Калеб, вы не можете писать в свой каталог приложений, но можете писать в папку "Документы приложений". Вы можете сделать это следующим образом:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

Ответ 4

Комплект приложений доступен только для чтения. Я вижу два способа:

1) Запись в папку документов:

NSArray *pathList = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path =  [myPathList  objectAtIndex:0];

2) Используйте базу данных sqlite. Это то же самое, что и 1 (вы все равно должны сохранять db в документах), но вы используете базу данных sqlite. Я думаю, что это лучше, чем много файлов txt и plist: здесь учебник по теме.

Ответ 5

Я использую следующий код:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *appFile = [documentsDirectory stringByAppendingPathComponent:@"set.txt"];

NSString *[email protected]"Kostas";

[data writeToFile:appFile atomically:YES];   

NSString *myData = [NSString stringWithContentsOfFile:appFile];   

NSLog(@"Data : %@ ",myData);