使用 NSFileHandle 覆盖数据

2024-05-14

使用 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 进行了更多研究之后,很明显,在不覆盖的情况下插入是不可能的。

正如中所解释的:使用 Objective c 在文本文件中的指定行插入字符串 https://stackoverflow.com/questions/4593418/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];
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 NSFileHandle 覆盖数据 的相关文章

随机推荐