- ベストアンサー
データファイルの行を削除する
掲示板のようなものを作っています。 データを、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 というふうになってしまいます。 通常、このような場合はどのように処理すればよろしいのでしょうか。 よろしくお願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
$buffに書き戻すデータがあるものとして答えます。 >1,ファイルをロックして読み込み >2,削除する以外の行を$buffに入れる >3,rewindでポインタを先頭に >4,書き込み、ロック解除 4.を以下のようにします。 書き込み、ファイルサイズの切りつめ、ロック解除 ここで、サイズの切りつめには、 ftruncate($fp, strlen($buff)); とします。
その他の回答 (1)
- hide1978
- ベストアンサー率42% (32/75)
ログが保存されているファイルを、仮にlog.datとします。 1:ファイルをロックして読み込み 2:削除する以外の行を$buffに入れる 3:$buffの内容をtmp.datに書き出し 4:log.datを削除 5:tmp.datをlog.datにリネーム ↑こんなんで如何でしょう。 各種関数に関しては参考URLを参照してください。
お礼
すいません、補足になりますが、複数のユーザーでファイルを編集する恐れがあるのですが、削除中はファイルロックできないですよね? どうすればよろしいでしょうか?
補足
ご回答ありがとうございます。 perl/CGIでもPHPでも、すでに書き込んだファイルの行を削除するってことはできないということなのでしょうか。
お礼
ご回答ありがとうございます。 希望通りの動きができました。 とても助かりました。