首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用NSFileHandle覆盖数据

用NSFileHandle覆盖数据
EN

Stack Overflow用户
提问于 2015-02-20 02:02:59
回答 1查看 2.5K关注 0票数 13

使用NSFileHandle,很容易使用truncateFileAtOffset从文件末尾删除n个字符。

代码语言:javascript
复制
-(void)removeCharacters:(int)numberOfCharacters fromEndOfFile:(NSFileHandle*)fileHandle {
    unsigned long long fileLength = [fileHandle seekToEndOfFile];
    [fileHandle truncateFileAtOffset:fileLength - numberOfCharacters];
}

但是,从文件前面删除字符似乎是不可能的,除非将所有剩余数据复制到内存中,覆盖文件,然后将剩余的数据写入文件中。

代码语言:javascript
复制
-(void)removeCharacters:(int)numberOfCharacters fromBeginningOfFile:(NSFileHandle*)fileHandle {
    [fileHandle seekToFileOffset:numberOfCharacters];

    NSData *remainingData = [fileHandle readDataToEndOfFile];
    [fileHandle truncateFileAtOffset:0];
    [fileHandle writeData:remainingData];
}

此代码可以工作,但将成为大文件的累赘。我遗漏了什么?

理想情况下,我希望能够执行replaceCharactersInRange:withData:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-20 21:04:51

在更多地使用NSFileHandle之后,很明显,插入而不覆盖是不可能的。

正如在以下文章中所解释的:Inserting a string at a specified line in text file using objective c您只能在最后生成一个文件,而不是在中间.”。

下面是上面代码的一个稍微优化的版本:

代码语言:javascript
复制
-(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];
}

我更关心的解决方案是将文件以块的形式缓冲到另一个文件中。这将减轻内存问题。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28620522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档