2013-04-25 2 views
2

В настоящее время я пытаюсь записать в файл, используя следующий код:Запись в файл - Objective C

NSString *state = @"Oklahoma"; 

    NSString *filepath = [[NSBundle mainBundle] pathForResource:@"StatesVisited" ofType:@"txt"]; 
    NSFileHandle *filehandle = [NSFileHandle fileHandleForWritingAtPath:filepath]; 
    [filehandle seekToEndOfFile]; 
    [filehandle writeData:[state dataUsingEncoding:NSUTF8StringEncoding]]; 
    [filehandle closeFile]; 

Из того, что я могу сказать, что это должно работать. Я смог прочитать из файла, используя тот же путь к файлу.

Когда я запускаю этот код и открываю свой текстовый файл, ничего не существует.

+2

Пожалуйста, имейте в виду, прочитав разрешение не означает, что у вас также есть разрешение на запись. –

+0

Как получить разрешение на запись и чтение в тот же файл? – Johnrad

+0

@JohnnyWhisman вы ** не можете ** получить разрешение на запись в основной комплект во время выполнения. После того как приложение будет скомпилировано и развернуто, пакет будет подписан. Это означает, что ваше вредоносное ПО изменило приложение. ** SandBox ** –

ответ

3

[NSBundle mainBundle] должен рассматриваться как только для чтения. Вместо этого скопируйте файл в пакет в каталог поддержки приложений и напишите там.

Используйте this, чтобы найти/создать каталог поддержки приложения.

+0

Я также часто читаю из файла. Нужно ли мне читать из файла в каталоге поддержки? – Johnrad

+2

Дело не в том, что основной пакет должен рассматриваться как только для чтения, это значит, что основной пакет доступен только для чтения (по крайней мере, на реальном устройстве). – rmaddy

+0

@rmaddy Это зависит от операционной системы. В Mac OS X он обычно доступен для записи, а в симуляторе iOS Xcode он, вероятно, будет доступен для записи, а на взломанных iPhone'ах он может быть доступен для записи (я не знаю об этом, вам придется протестировать). Даже когда вы можете писать, это плохая идея, так как обновление до новой версии приложения перезапишет файл. –

1

Запрещается записывать на ресурсы в основной комплект. В этом случае вы должны использовать /Documents или /Library пути песочницы.

При первом запуске приложения просто скопируйте все упакованные документы/файлы в/Documents, here's a link.

После этого просто следуйте своему собственному дизайну - на этот раз все будет хорошо.

+0

Я добавил этот код к моему методу viewDidLoad для моего просмотра. Изменит ли он какой-либо код, который я написал для чтения и записи. Или это все, что мне нужно было добавить? – Johnrad

+0

Вместо того, чтобы создавать путь к файлу из NSBundle, вам нужно найти путь из папки/Documents: –

0

Возможно, вы получаете нулевой дескриптор файла с fileHandleForWritingAtPath:, потому что вы пытаетесь открыть файл в своем приложении. Вы можете записать данные в NSUserDefaults, если это подходит. В противном случае вы должны написать файл в каталог поддержки вашего приложения. Следующие blog post описывает, как получить его или следовать совету @Sebastians в папке «Документ».

0

Попробуйте

NSString *state = @"Oklahoma"; 
NSString *strPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
       strPath = [strPath stringByAppendingPathComponent:@"StatesVisited.txt"]; 
       [state writeToFile:strPath 
          atomically:NO 
          encoding:NSStringEncodingConversionAllowLossy 
           error:nil];