使用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:
发布于 2015-02-20 21:04:51
在更多地使用NSFileHandle之后,很明显,插入而不覆盖是不可能的。
正如在以下文章中所解释的:Inserting a string at a specified line in text file using objective 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];
}我更关心的解决方案是将文件以块的形式缓冲到另一个文件中。这将减轻内存问题。
https://stackoverflow.com/questions/28620522
复制相似问题