1

私はファイル ハンドラー クラスに取り組んでおり、ファイル ストリームに関するいくつかの問題が発生しています。追加や上書きなどの操作の機能を提供するには、fopen に渡されるモードを変更するだけです。

ただし、挿入、更新、および削除を簡単に行う方法を提供することは、より困難であることがわかっています。ほとんどの場合、私が抱えている問題はすべて fwrite にあります。

挿入 - 私の知る限り、fwrite を使用してファイルの末尾以外の場所に文字を挿入する方法はありません。私が思いついた 2 つのオプションは、file_get_contents を使用することと、fseek/fwrite を多用してファイルを拡張することです。

削除 - 残念ながら、fwrite を使用して NULL を書き込もうとすることは、文字を「削除」することと同じではありません。データの挿入と同様に、オプションは file_get_contents と fseek/fwrite です。

更新 - ファイル内のデータの更新は、挿入/削除の問題の組み合わせです。新しい値が古い値よりも短い場合は、追加の文字を削除する必要があります。新しい値が古い値よりも長い場合は、追加の文字を挿入する必要があります。それらが同じ長さであれば、単純に fwrite を使用するだけで問題ありません。

うまくいけば、この問題をきれいに解決できることを私が認識していないことがあります。私が見つけた各オプションは、file_get_contents (ファイル全体をメモリに読み込む必要があるため気にしません) を使用するか、fseek/fwrite を多用してファイルの長さを変更します (これは複雑に思えます)。

私が思いつかなかったアイデアを持っている人はいますか?

ありがとう!

4

2 に答える 2

1

それでおしまい。ほとんどすべての言語が同じ方法でそれを行います。推奨される方法は、一時ファイルを使用し、元のファイルを 1 つずつ転送してから、一時ファイルを元のファイルの上にアトミックに移動することです。

ただし、そのようなことを、より最適化された方法で実行するプログラムがあります。主にデータベース エンジンです。

于 2010-06-29T13:56:10.933 に答える
1

file_get_contents() を使用するのではなく、常に fseek() と fwrite() を使用して、固定サイズの「チャンク」でファイルをシャッフルすることができます。ロジックはかなり単純ですが、C ライブラリとしてではなく、PHP で直接実装すると面倒で遅くなると思います。

于 2010-06-29T13:53:41.343 に答える