Перезаписать данные с помощью NSFileHandle

Используя NSFileHandle, довольно легко удалить n количество символов из конца файла с помощью truncateFileAtOffset.

-(void)removeCharacters:(int)numberOfCharacters fromEndOfFile:(NSFileHandle*)fileHandle {
    unsigned long long fileLength = [fileHandle seekToEndOfFile];
    [fileHandle truncateFileAtOffset:fileLength - numberOfCharacters];
}

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

-(void)removeCharacters:(int)numberOfCharacters fromBeginningOfFile:(NSFileHandle*)fileHandle {
    [fileHandle seekToFileOffset:numberOfCharacters];

    NSData *remainingData = [fileHandle readDataToEndOfFile];
    [fileHandle truncateFileAtOffset:0];
    [fileHandle writeData:remainingData];
}

Этот код работает, но станет ответственностью с большими файлами. Что мне не хватает?

В идеале я хотел бы иметь возможность делать replaceCharactersInRange: withData:

Ответ 1

После игры с NSFileHandle стало ясно, что вставка без перезаписи невозможна.

Как объясняется в: Вставка строки в заданную строку в текстовом файле с использованием объектива c ", вы можете увеличить только файл в конце, а не в средний."

Вот несколько более оптимизированная версия вышеприведенного кода:

-(void)removeCharacters:(unsigned long long)numberOfCharacters fromBeginningOfFile:(NSFileHandle*)fileHandle {
    [fileHandle seekToFileOffset:numberOfCharacters];

    NSData *remainingData = [fileHandle readDataToEndOfFile];
    [fileHandle seekToFileOffset:0];
    [fileHandle writeData:remainingData];
    [fileHandle truncateFileAtOffset:remainingData.length];
}

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