我正在处理文件处理程序类,并且遇到了文件流的一些问题。为append和overwrite等操作提供功能只需更改传递给fopen的模式即可。
然而,提供一种简单的插入,更新和删除方式被证明更具挑战性。差不多,我遇到的所有问题都是fwrite。
插入 - 据我所知,没有办法使用fwrite在文件末尾以外的位置插入字符。我提出的两个选项是使用file_get_contents并大量使用fseek / fwrite来扩展文件。
删除 - 不幸的是,尝试使用fwrite写入NULL与“删除”字符不同。与插入数据一样,选项也是file_get_contents和fseek / fwrite。
更新 - 更新文件中的数据是插入/删除问题的组合。如果新值比旧值短,那么我必须删除其他字符。如果新值比旧值长,我必须插入其他字符。如果长度相同,那么只需使用fwrite即可。
希望有一些我不知道哪些可以干净地解决这个问题。我发现的每个选项都使用file_get_contents(我不关心,因为整个文件必须被读入内存)或者大量使用fseek / fwrite来改变文件的长度(这对我来说似乎很复杂)。
有没有人有我没想过的想法?
谢谢!
答案 0 :(得分:1)
你总是可以使用fseek()和fwrite()以固定大小的“块”来混洗文件,而不是使用file_get_contents()。逻辑相当简单,但我怀疑如果直接在PHP而不是C库中实现它会很麻烦和缓慢。
答案 1 :(得分:1)
就是这样。几乎每种语言都会以同样的方式完成。推荐的方法是使用临时文件,然后逐个传输原始文件,然后将原始文件原子移动到原始文件上。
但是,有一些程序可以为您做这些事情,并且采用更加优化的方式 - 主要是数据库引擎。