使用NSFileHandle覆盖数据

使用NSFileHandle,使用truncateFileAtOffset从文件末尾删除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]; } 

此代码有效,但将成为大文件的责任。 我错过了什么?

理想情况下,我想能够做replaceCharactersInRange:withData:

用NSFileHandle玩了更多之后,很明显插入而不覆盖是不可能的。

如下所示: 使用目标c在文本文件的指定行中插入一个string “最后只能生成文件,而不能在中间生成文件 ”。

这里是上面代码的稍微更优化的版本:

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

我更多的参与解决scheme将缓冲区块中的文件到另一个文件。 这将减轻内存方面的顾虑。