2012-01-19 3 views
1

Когда я использую:iPhone Unix доступ к файлам

int fd = open(fileNameWitPath, O_CREAT | O_RDWR); 

в тренажер устройства все правильно. Но возврат физического устройства fd = -1 и errno = 0x0d (13), разрешение отклонено.

Путь к назначению - это песочница приложения. Документы или путь tmp.

Можно ли записать & файлы на iPhone, в частной области приложения, с помощью функции Unix без джейлбрейка?

+1

вы можете получить доступ к файлам в изолированной программной среде вашего приложения (например, папке «Документы»). как вы получаете 'fileNameWitPath'? чтобы получить каталог документов, который вам нужно выполнить: 'NSArray * paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); NSString * docPath = [paths objectAtIndex: 0]; 'для temp dir:' NSTemporaryDirectory() '- это NSString с указанием пути к tmp –

+0

« как вы получаете ... »: NSArray * dp = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask , ДА); NSString * path = [dp objectAtIndex: 0]; – theWalker

+0

Пожалуйста, перечитайте мой ответ. Я переписал его. Код работает сейчас. – Diziet

ответ

0

* Законченный переписывают ответа *

Следующий код работает: выход

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    // Override point for customization after application launch. 
    self.window.backgroundColor = [UIColor whiteColor]; 
    [self.window makeKeyAndVisible]; 

    NSArray *dp = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *path = [dp objectAtIndex:0]; 
    NSString *fileNameWithPath = [NSString stringWithFormat:@"%@/%@",path,@"fileName.txt"]; 
    int fd = open([fileNameWithPath UTF8String], O_CREAT | O_RDWR); 

    NSLog(@"Open %@ for writing returned %d",fileNameWithPath,fd); 

    return YES; 
} 

Debug:

Re-enabling shared library breakpoint 1 
(gdb) n 
30  NSLog(@"Open %@ for writing returned %d",fileNameWithPath,fd); 
(gdb) n 
2012-01-20 11:01:23.161 FOpen[6535:707] Open /var/mobile/Applications/AF7EA358-E4AA-491F-AEA1-83080F2749E5/Documents/fileName.txt for writing returned 6 
32  return YES; 

Ключ заключается в том, что вы должны передать функции с «открытым строка ac style, например [fileNameWithPath UTF8String]. Если вы используете ARC, вам, возможно, придется немного поработать над тем, чтобы компилятор был счастлив, но я не могу это подтвердить.

+0

Итак, я использую тот же путь, чтобы получить путь, но результат open() ora creat() всегда равен -1 с errno 0x0d. Тот же результат для пути tmp: NSString * path = NSTemporaryDirectory(); И одно - в XCode Organizer, Applications (для моего устройства) и «Файлы данных в песочнице» - файл существует, но с длиной = 0B. – theWalker

+0

путь на устройстве, где я пытаюсь записать файл:/var/mobile/Applications/7FF29BC7-B6D1-41CF-8621-CC6DFEEEEF045/Documents – theWalker

+0

«... файл существует, но с длиной = 0B ...» это означает, что open() создать файл, но не возвращать дескриптор, говорит «access denied». Я совершенно не понимаю. – theWalker

2

Он должен работать нормально, но вы должны помнить, что iOS Simulator использует другую файловую систему, чем реальное устройство. И тот факт, что вы можете читать только файлы из пакета, а не WRITE, и пытаетесь открыть с правами на чтение \ запись. пожалуйста, проверьте значение fileNameWitPath

Правильный способ получить каталог документов является:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

Вы должны использовать

NSFileManager *fileManager = [NSFileManager defaultManager]; 
[fileManager createFileAtPath: contents: attributes:] 

вместо

int fd = open(fileNameWitPath, O_CREAT | O_RDWR); 
+0

Я думаю, что это случай «Вы должны использовать» вместо «Вы также можете использовать»: P – Diziet

+0

Или нет ... Я обновил свой ответ. – Diziet

+0

После 2 дней борьбы с доступом к файлам мой вывод: posix io ​​функции под устройством, в папке «.../Documents /», работают плохо. Файл создается, но open() или creat() всегда возвращают дескриптор -1 с errno 0x0d. iPhone очень странный для меня :) Это работает под Symbian, Android и т. д., но не работает под iOS. Теперь я использую fileManager, и все в порядке. – theWalker

0

Я написать письмо:

int fd = open(fileNameWithPath, O_CREAT | O_RDWR); 

Но «призыва к„открытому“требует третьего аргумента, когда„O_CREAT“установлен». Строка кода должна быть (для разрешения RW):

int fd = open(fileNameWithPath, O_CREAT | O_RDWR, 0x0666); 

и эта работа хорошо.

[править] Я был написать:

int fd = open(fileNameWithPath, O_CREAT | O_RDWR, 0x0666); 

это ошибка, Umask должна быть 666, но восьмеричное, не шестигранной:

int fd = open(fileNameWithPath, O_CREAT | O_RDWR, 00666); 
2

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

Без третьего параметра откройте (...) будет работать в первый раз и с ошибками -1 и EACCES при последующих запусках, потому что приложение создало файл в первый раз, но больше не имеет права доступа к файлу. (Если вы перекомпилируете и тестируете на устройстве и видите ошибку, это связано с тем, что вам нужно удалить приложение, которое удаляет файл с неправильным доступом.)

Смежные вопросы