问题 使用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:


7771
2018-02-20 02:02


起源



答案:


在使用NSFileHandle进行更多游戏后,很明显无法覆盖的插入是不可能的。

如下所述: 使用目标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];
}

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


9
2018-02-20 21:04



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


答案:


在使用NSFileHandle进行更多游戏后,很明显无法覆盖的插入是不可能的。

如下所述: 使用目标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];
}

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


9
2018-02-20 21:04



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