記事表示

ファイル入出力改良版

排他ロックを利用しつつ、どのタイミングでプログラムが強制終了しても、ファイルがクリアされないようにしてみた。

/* ファイルの先頭に追加 */
$fp = fopen('data.txt', 'r+') or exit('error!');
flock($fp, LOCK_EX);

$no   = 0;
$data = '';

while ($line = fgets($fp)) {
  if (intval($line) > $no) {
    $no = intval($line);
  }
  $data .= $line;
}

$no++;

rewind($fp);
fwrite($fp, "$no\t" . date('H:i:s') . "\n$data");

flock($fp, LOCK_UN);
fclose($fp);
/* ファイルの末尾に追加 */
$fp = fopen('data.txt', 'a+') or exit('error!');
flock($fp, LOCK_EX);

$no = 0;

while ($line = fgets($fp)) {
  if (intval($line) > $no) {
    $no = intval($line);
  }
}

$no++;

fwrite($fp, "$no\t" . date('H:i:s') . "\n");

flock($fp, LOCK_UN);
fclose($fp);
/* 任意の行を編集 */
$fp = fopen('data.txt', 'r+') or exit('error!');
flock($fp, LOCK_EX);

$no   = 3;  //No.3のデータを編集
$data = '';

while ($line = fgets($fp)) {
  if (intval($line) == $no) {
    $data .= "$no\t" . date('H:i:s') . "\n";
  } else {
    $data .= $line;
  }
}

rewind($fp);
fwrite($fp, $data);
ftruncate($fp, ftell($fp));

flock($fp, LOCK_UN);
fclose($fp);
/* 任意の行を削除 */
$fp = fopen('data.txt', 'r+') or exit('error!');
flock($fp, LOCK_EX);

$no   = 3;  //No.3のデータを削除
$data = '';

while ($line = fgets($fp)) {
  if (intval($line) != $no) {
    $data .= $line;
  }
}

rewind($fp);
fwrite($fp, $data);
ftruncate($fp, ftell($fp));

flock($fp, LOCK_UN);
fclose($fp);

ページ移動

トラックバックURL

  • http://www.favorite-labo.org/blog/trackback/22

トラックバック

  • トラックバックはまだありません。

コメント

tifos URL

ども。
えー、私の手持ちのコードと…完全に一致しました。笑 素晴らしいですね。
お疲れ様でございます。

  • 2008/03/26 23:15

ないと

アドバイスがなかったら、当分'w'モードで読み書きしていたと思われます。
ありがとうございます~。m(_ _)m

ファイル入出力の方法なんて基礎中の基礎なのだから、公式サイトのflock解説ページに、'r+'モードでの読み書きについて詳しく書いておいてほしかったです。(^^;

下の方に英語で書かれていますが、それより先に'w'や'w+'モードでの例が載っているのはちょっと…。しかも、全然ロックになっていないような気がします。何故こんなコードが…。

  • 2008/03/27 10:39

コメント投稿

  • コメントを入力して投稿ボタンを押してください。
投稿フォーム
名前
Eメール
URL
コメント
投稿キー

投稿キーには以下の数値を半角で入力してください。(スパム対策)

投稿キー

ユーティリティ

2008年12月

- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -

ツールメニュー

メッセージ

匿名で一言送信できます。

送信フォーム
メッセージ

RSSリーダー

  • JavaScriptをONにすると、RSSリーダーが表示されます。

利用ツール