Запись в файл с помощью [NSBundle mainBundle] завершается неудачно - PullRequest
14 голосов
/ 02 мая 2011

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

У меня есть база словЯ хочу разделить слова на разные файлы в зависимости от количества букв.Все четырехбуквенные слова помещаются в один файл и так далее.Я добавил текстовый файл с именем «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]];
}

Ответы [ 5 ]

22 голосов
/ 02 мая 2011

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

8 голосов
/ 18 сентября 2012

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

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

/AppName.app

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


/ Документы /

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


/ Library /

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

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

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

7 голосов
/ 02 мая 2011

Как сказал Калеб, вы не можете писать в каталог своего приложения, но вы можете писать в папку «Документы» своего приложения. Вы можете получить это так:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
4 голосов
/ 02 мая 2011

Пакет вашего приложения доступен только для чтения.Есть два способа просмотра:

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

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

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

2 голосов
/ 03 февраля 2013

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

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

NSString *data=@"Kostas";

[data writeToFile:appFile atomically:YES];   

NSString *myData = [NSString stringWithContentsOfFile:appFile];   

NSLog(@"Data : %@ ",myData);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...