• ベストアンサー

データファイルの行を削除する

掲示板のようなものを作っています。 データを、1投稿につき1行使って、項目を記号を使って分割させています。 1,こんにちは,umi,2004-4-1 みたいな感じですが、記事を1行削除するときの処理なのですが、 1,ファイルをロックして読み込み 2,削除する以外の行を$buffに入れる 3,rewindでポインタを先頭に 4,書き込み、ロック解除 のような処理をしているのですが、一番下の行に古いデータが残ってしまいます。 例えば 4,またあした,umi,2004-4-1 3,おはよう,umi,2004-4-1 2,さようなら,umi,2004-4-1 1,こんにちは,umi,2004-4-1 というデータの上から2行目を削除すると 4,またあした,umi,2004-4-1 2,さようなら,umi,2004-4-1 1,こんにちは,umi,2004-4-1 1,こんにちは,umi,2004-4-1 というふうになってしまいます。 通常、このような場合はどのように処理すればよろしいのでしょうか。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
noname#18290
noname#18290
回答No.2

$buffに書き戻すデータがあるものとして答えます。 >1,ファイルをロックして読み込み >2,削除する以外の行を$buffに入れる >3,rewindでポインタを先頭に >4,書き込み、ロック解除 4.を以下のようにします。 書き込み、ファイルサイズの切りつめ、ロック解除 ここで、サイズの切りつめには、 ftruncate($fp, strlen($buff)); とします。

umioyo
質問者

お礼

ご回答ありがとうございます。 希望通りの動きができました。 とても助かりました。

その他の回答 (1)

  • hide1978
  • ベストアンサー率42% (32/75)
回答No.1

ログが保存されているファイルを、仮にlog.datとします。 1:ファイルをロックして読み込み 2:削除する以外の行を$buffに入れる 3:$buffの内容をtmp.datに書き出し 4:log.datを削除 5:tmp.datをlog.datにリネーム ↑こんなんで如何でしょう。 各種関数に関しては参考URLを参照してください。

参考URL:
http://jp.php.net/manual/ja/ref.filesystem.php
umioyo
質問者

お礼

すいません、補足になりますが、複数のユーザーでファイルを編集する恐れがあるのですが、削除中はファイルロックできないですよね? どうすればよろしいでしょうか?

umioyo
質問者

補足

ご回答ありがとうございます。 perl/CGIでもPHPでも、すでに書き込んだファイルの行を削除するってことはできないということなのでしょうか。

関連するQ&A