使用 NSFileHandle 覆盖数据
Overwrite Data using 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 之后,很明显插入而不覆盖是不可能的。
如以下所述: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];
}
我更复杂的解决方案是将文件缓冲到另一个文件中。这将减轻内存问题。
使用 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 之后,很明显插入而不覆盖是不可能的。
如以下所述: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];
}
我更复杂的解决方案是将文件缓冲到另一个文件中。这将减轻内存问题。