【问题标题】:PHP - Shortcomings of fwrite?PHP - fwrite 的缺点?
【发布时间】:2011-03-09 15:36:42
【问题描述】:

我正在研究一个文件处理程序类,并且遇到了一些文件流问题。为追加和覆盖等操作提供功能只是更改传递给 fopen 的模式的简单问题。

但是,事实证明,提供一种简单的插入、更新和删除方法更具挑战性。几乎,我遇到的所有问题都与 fwrite 有关。

插入 - 据我所知,没有办法使用 fwrite 在文件末尾以外的位置插入字符。我想出的两个选项是使用 file_get_contents 和大量使用 fseek/fwrite 来扩展文件。

删除 - 不幸的是,尝试使用 fwrite 写入 NULL 与“删除”字符不同。与插入数据一样,选项仍然是 file_get_contents 和 fseek/fwrite。

更新 - 更新文件中的数据是插入/删除问题的组合。如果新值比旧值短,那么我必须删除额外的字符。如果新值比旧值长,我必须插入额外的字符。如果它们的长度相同,那么只需使用 fwrite 就可以了。

希望有一些我不知道的东西可以彻底解决这个问题。我发现的每个选项都使用 file_get_contents(我不在乎,因为必须将整个文件读入内存)或大量使用 fseek/fwrite 来更改文件的长度(这对我来说似乎很复杂)。

有没有人有我没想到的想法?

谢谢!

【问题讨论】:

  • 我不能使用数据库收集?
  • 没错。不幸的是,我必须处理平面文件而不是数据库。虽然,我希望在该类上获得一个足够干净的接口,以便它也可以用作数据库处理程序。

标签: php stream fopen


【解决方案1】:

您总是可以使用 fseek() 和 fwrite() 以固定大小的“块”来随机播放文件,而不是使用 file_get_contents()。逻辑相当简单,但我怀疑如果直接在 PHP 中实现而不是作为 C 库实现会很麻烦且缓慢。

【讨论】:

  • 是的,这就是我所指的 fseek/fwrite 选项。我也有同感。
【解决方案2】:

就是这样。几乎每种语言都会以同样的方式做到这一点。推荐的方法是使用临时文件,将原始文件逐段传输,然后将临时文件原子地移动到原始文件之上。

但是,有些程序可以为您做这些事情,并且以一种更加优化的方式 - 主要是数据库引擎。

【讨论】:

    猜你喜欢
    • 2011-05-10
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多