2010-06-29 125 views
1

我正在处理一个文件处理程序类,并遇到一些文件流的问题。提供诸如追加和覆盖等操作的功能是改变传递给fopen的模式的一个简单问题。PHP - fwrite的缺点?

但是,提供插入,更新和删除的简单方法被证明是更具挑战性的。几乎所有我遇到的问题都是使用fwrite。

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

删除 - 不幸的是,试图用fwrite编写NULL与'删除'字符不是一回事。就像插入数据一样,选项也是file_get_contents和fseek/fwrite。

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

希望有一些我不知道哪些可以干净地解决这个问题。我发现的每个选项都使用file_get_contents(我不在乎,因为整个文件必须读入内存),或者大量使用fseek/fwrite来更改文件的长度(这似乎令人费解)。

有没有人有一个想法,我没有想到?

谢谢!

+0

我收集使用数据库不是一个选项? – 2010-06-29 13:53:31

+0

这是正确的。不幸的是,我不得不处理平面文件而不是数据库。虽然,我希望在类上获得足够干净的接口,以便它可以作为数据库处理程序重用。 – Ogo 2010-06-29 14:13:19

回答

1

您总是可以使用fseek()和fwrite()以固定大小的“区块”而不是使用file_get_contents()来混洗文件。这个逻辑非常简单,但我认为如果直接在PHP中而不是C库中执行,这会很麻烦和缓慢。

+0

是的,这就是我所指的fseek/fwrite选项。我对此也有同感。 – Ogo 2010-06-29 14:21:06

1

就是这样。几乎所有的语言都会以同样的方式进行操作。推荐的方法是使用临时文件,并逐个传输原始文件,然后将临时文件原子移动到原始文件上。

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