Ios 使用NSFileHandle覆盖数据

Ios 使用NSFileHandle覆盖数据,ios,nsfilehandle,Ios,Nsfilehandle,使用NSFileHandle,使用TruncateFileToffset很容易从文件末尾删除n个字符 -(void)removeCharacters:(int)numberOfCharacters fromEndOfFile:(NSFileHandle*)fileHandle { unsigned long long fileLength = [fileHandle seekToEndOfFile]; [fileHandle truncateFileAtOffset:fileLe

使用NSFileHandle,使用TruncateFileToffset很容易从文件末尾删除n个字符

-(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];
}
这段代码可以工作,但是对于大文件来说,它将成为一种负担。我错过了什么


理想情况下,我希望能够使用数据执行ReplaceCharactersRange:withData:

在使用NSFileHandle进行更多操作之后,很明显,不覆盖插入是不可能的

如:“<强>你只能在末端生长文件,而不是在中间。< /强>”

下面是上述代码的稍微优化的版本:

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

我认为,更复杂的解决方案是将文件分块缓冲到另一个文件中。这将减轻内存问题。

这是一个很好的解决方案。我建议将方法的签名更新为:-(void)removeCharacters:(unsigned long long)numberOfCharacters fromBeginingOffile:(NSFileHandle*)fileHandle{