Доступ к файлам iPhone в Unix - PullRequest
1 голос
/ 19 января 2012

Когда я использую:

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

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

Путь назначения представляет собой изолированную программную среду приложения Documents или tmp path.

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

Ответы [ 4 ]

2 голосов
/ 21 февраля 2015

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

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

2 голосов
/ 19 января 2012

Все должно работать нормально, но вы должны помнить, что iOS Simulator использует файловую систему, отличную от реального устройства. И тот факт, что вы можете только ЧИТАТЬ файлы из комплекта, а не ЗАПИСАТЬ, и вы пытаетесь открыть с разрешения на чтение / запись. пожалуйста, проверьте значение 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 голосов
/ 20 января 2012

Мне было написано:

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

Но " Для вызова 'open' требуется третий аргумент, когда для 'O_CREAT' установлено ".Строка кода должна быть (для разрешений RW):

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

, и это прекрасно работает.

[edit] Мне было написано:

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

thisэто ошибка, значение umask должно быть 666, но восьмеричное, а не шестнадцатеричное:

int fd = open(fileNameWithPath, O_CREAT | O_RDWR, 00666);
0 голосов
/ 19 января 2012

* Завершить переписать ответ *

Работает следующий код:

- (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;
}

Отладочный вывод:

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;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...