jiichan.com

PROGRAMMING

テキストファイルの操作

phpに限らず、プログラミングではテキストファイルの読み込み・書き込みなどを行う処理が多くでてきます。 今回はphpでのテキストファイルの読み書きについて確認します。

ファイル処理の流れ

言語により多少の違いはありますが、ファイル処理の流れは概ね次の通りです。 1. ファイルを開く 2. ファイルをロックする 3. データを処理する(読み込む・追加する・上書きする) 4. ファイルのロックを解除する 5. ファイルを閉じる

ファイルを開く

ファイルを開くときにはfopen()関数を使用します。fopen()関数の戻り値はファイルポインタです。

書式:fopen(ファイルパス, 読み書きモード) 用例:$fp = fopen("../test/sample.txt", "r")
読み書きのモードには主に次のような値があります。

モード読み書き指定のファイルが無いとき
r読みエラー
r+読み・書きエラー
w上書き新規作成
w+上書き・読み新規作成
a追加新規作成
a+追加・読み新規作成

ファイルをロックする・ロックを解除する

ファイルを処理中にその内容が変更されないようにロックします。flock()関数を使用します。 flock()はロックの解除にも使用します。

書式:flock(ファイルポインタ, ロックの方法) 用例:flock($fp, LOCK_EX)

ロックの方法説明
LOOK_SH共有ロック:参照は出来るが変更が出来ない
LOOK_EX排他的ロック:参照も変更も出来ない
LOCK_UNロックを解除
LOCK_NBロック中にflock()でブロックさせない

データを処理する

データの読み込み・書き込みにはそれぞれ次の関数を使います。
データの読み込みにはfgets()関数を使用します。ファイルから1行(改行単位で)読み込みます。

書式:fgets(ファイルポインタ) 用例:fgets($fp)
データの書き込みにはfputs()かfwrite()、どちらも同じものです。

書式:fputs(ファイルポインタ, 書き込む文字列) 用例:fputs($fp, "あいうえお")

ファイルを閉じる

データを処理し、ロックを解除した後はfclose()関数でファイルを閉じます。

書式:fclose(ファイルポインタ) 用例:fclose($fp)

コードの一連の流れ

今までの関数を使ったコードのサンプルです。


// 読み込みモードでファイルオープン
$fp = fopen("../test/sample.txt", "r") or die("file open error");

// ファイルを共有ロック
flock($fp, LOCK_SH);

// ファイルの最後まで一行づつデータを表示
while(!feof($fp)){
	$string = fgets($fp);
	echo $string."<br>";
}

// ロックを解除
flock($fp, LOCK_UN);

// ファイルを閉じる
fclose($fp);

// 追加モードでファイルオープン
$fp = fopen("../test/sample.txt", "a") or die("file open error");

// ファイルを排他ロック
flock($fp, LOCK_EX);

// データを改行文字付きで書き込み
fputs($fp, "あいうえお\n");

// ロックを解除
flock($fp, LOCK_UN);

// ファイルを閉じる
fclose($fp);

読み込みに便利なfile()関数

この他に便利な関数に、fopen()とfclose()を内部的に処理しているfile()関数もあります。
ファイルを一気に読み込み、各行が要素になった配列を返します。


// ファイルの全データを行を要素にした配列に
$aryText = file("../test/sample.txt");

// 配列の内容を一行ずつ表示
foreach($aryText as $key=>$value){
	echo ($key + 1)."行目:".$value;
}

読み込み処理にはこれが一番コードが少なく便利です。



この他にもファイル操作には便利な関数が沢山あります。