Не удалось отредактировать первый байт файла с помощью NSFileHandle

В моем приложении я использую NSFileHandle для редактирования некоторого файла, но не редактирую.

Ниже приведен код: с комментариями и выводом логов

    //Initialize file manager
    NSFileManager *filemgr;
    filemgr = [NSFileManager defaultManager];

    //Initialize file handle
    NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:filePath];

    //Check if file is writable
    if ([filemgr isWritableFileAtPath:filePath]  == YES)
        NSLog (@"File is writable");
    else
        NSLog (@"File is read only");

    //Read 1st byte of file
    NSData *decryptData = [fileHandle readDataOfLength:1];

    //Print first byte & length
    NSLog(@"data1: %d %@",[decryptData length],decryptData);   //data2: 1 <37>

    //Replace 1st byte
    NSData *zeroData = 0;
    [fileHandle writeData:zeroData];

    //Read 1st byte to check
    decryptData = [fileHandle readDataOfLength:1];

    //Print first byte
    NSLog(@"data2: %d %@",[decryptData length],decryptData);  //data2: 1 <00>

    NSURL *fileUrl=[NSURL fileURLWithPath:filePath];
    NSLog(@"fileUrl:%@",fileUrl);

    [fileHandle closeFile];

Какие-либо предложения?


person iDilip    schedule 14.06.2012    source источник


Ответы (1)


Если вы хотите писать с помощью NSFileHandle, вам нужно открыть файл как для записи, так и для чтения:

NSFileHandle *fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:filePath];

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

Кроме того, для записи данных необходимо создать экземпляр NSData. Строка кода

NSData *zeroData = 0;

создает объект nil, а не объект, содержащий нулевой байт. Я думаю, ты хочешь

int8_t zero = 0;
NSData *zeroData = [NSData dataWithBytes:&zero length:1];
person sbooth    schedule 14.06.2012
comment
Спасибо sbooth за беспокойство. Как вы предлагаете, я изменил NSFileHandle на NSFileHandle *fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:filePath]; Но все еще не обновляя 1-й байт. что ты думаешь? - person iDilip; 14.06.2012