【问题标题】:Overwrite Data using NSFileHandle使用 NSFileHandle 覆盖数据
【发布时间】:2015-04-21 15:11:10
【问题描述】:

使用 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];
}

此代码有效,但会成为大文件的负担。我错过了什么?

理想情况下,我希望能够替换CharactersInRange:withData:

【问题讨论】:

    标签: ios nsfilehandle


    【解决方案1】:

    在玩了更多的 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];
    }
    

    我更多涉及的解决方案是将文件分块缓冲到另一个文件中。这将缓解内存问题。

    【讨论】:

    • 这是一个不错的解决方案。我建议将方法的签名更新为: -(void)removeCharacters:(unsigned long long)numberOfCharacters fromBeginningOfFile:(NSFileHandle*)fileHandle {
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    相关资源
    最近更新 更多