ファイルを1行ずつ処理するときの基本的な流れは、 ファイルを開いて(fopen)、 ファイルを読んで(fgets)あるいはファイルに書き込んで(fputs)、 ファイルを閉じる(fclose)、 という流れになります。
ファイルのオープン
fopen関数を使用します。
$filename = './sample.txt';
$fh = fopen($filename,"a");
fopenのエラーを無視したい場合、エラー制御演算子@を利用します。
$filename = './sample.txt';
$fh = @fopen($filename,"a");
ファイルハンドル
fopenの戻り値はファイルハンドルと呼ばれます。 ファイルハンドルとはファイルにアクセスするときの値のことです。
ファイルモード
fopenの第2引数はファイルモードと呼ばれます。指定できるモードには次のようなものがあります。
| r | 読み込みのみでオープン。ファイルポインタはファイルの先頭におきます。 |
| r+ | 読み書き可能な状態でオープン。ファイルポインタはファイルの先頭におきます。 |
| w | 書き込みのみでオープン。ファイルポインタはファイルの先頭におき、ファイルサイズをゼロにします。ファイルが存在しない場合は新規作成します。 |
| w+ | 読み書き可能な状態でオープン。ファイルポインタはファイルの先頭におき、ファイルサイズをゼロにします。ファイルが存在しない場合は新規作成します。 |
| a | 追加書き込みのみでオープン。ファイルポインタをファイルの終端におき、ファイルが存在しない場合は新規作成します。 |
| a+ | 追加書き込み・読み取りでオープン。ファイルポインタをファイルの終端におき、ファイルが存在しない場合は新規作成します。 |
流れ制御
fopenでファイルが開けないときを考慮しましょう。 開けないときはファイルハンドラにFALSEが代入されます。ファイルハンドラの値によって 処理を分岐させます。
if(!$fh){
//エラーメッセージとともにスクリプトを終了。
}else{
//処理を継続
}
ファイルのロック
他のユーザーが書き込めないようにファイルをロックしましょう。 flock関数を使用します。
flock($fh,LOCK_EX);
第二引数でロック定数を指定します。ロック定数には以下のようなものがあります。
| LOCK_SH | 共有ロック。ロックされていても他のユーザーが読み込むことができます。 |
| LOCK_EX | 排他ロック。 |
| LOCK_UN | ロック解除。 |
ファイルに書き込む
fputs関数を使用して、ファイルに文字列を書き込みます。
$str='テストだよん';
fputs($fh,$str);
ファイルのクローズ
fopen関数で開いたファイルをクローズするときは、 fclose関数を使用します。
fclose($fh);
ファイル書き込み処理のスクリプト
ここまでの処理をまとめると次のようなスクリプトになります。
//ファイル書き込み処理のスクリプト
$str='テストだよん';
$filename = './sample.txt';
$fh = fopen($filename,"a");
if(!$fh){
//エラーメッセージとともにスクリプトを終了。
exit("ファイル書き込みオープンに失敗しました");
}else{
//処理を継続
flock($fh,LOCK_EX);
fputs($fh,$str);
flock($fh,LOCK_UN);
fclose($fh);
}
ファイルを読み込む
読み込みモードでファイルをオープンします。fopen関数を使用します。
$fh = fopen($filename,"r");
これでOKですが、ファイルが存在するかどうかをまず確かめます。
ファイルが存在するかどうかの確認
file_exists関数を使用して、ファイルが存在するかどうかの確認をします。
if(file_exists($filename)){
//処理
}
ファイルを1行ずつ読み込み
fgets関数を使用して、ファイルを1行ずつ(改行まで)読み込みます。
$tmp = fgets($fh);
ファイルの終わりまで繰り返し
ファイルの終わりはfeof関数を使用して判断します。ループ処理と組み合わせます。
while(!feof($fh)){
$tmp = fgets($fh);
//$tmpに対して処理
}
ファイル読み込み処理(まとめ)
ここまでの処理をまとめると次のようなスクリプトになります。
//ファイル読み込み処理のスクリプト
$str='';
$filename = './sample.txt';
if(file_exists($filename)){
$fh = @fopen($filename,"r");
if(!$fh){
//エラーメッセージとともにスクリプトを終了。
exit("ファイル読み込みオープンに失敗しました");
}else{
//処理を継続
while(!feof($fh)){
$tmp = fgets($fh);
echo $tmp.'<br>';
}
fclose($fh);
}
}
ファイルをまるごと読み込み
ファイルをまるごと読み込む
file_get_contents関数を利用して、ファイルをまるごと読み込みます。
$contents = file_get_contents($filename);
ファイルに変数の内容を書き込む
file_put_contents関数を利用して、ファイルに変数の内容を書き込みます。
file_put_contents($filename,$contents);
ファイルをまるごと読み込んで配列に格納
file関数は、ファイルをまるごと読み込んで1行ずつ配列に格納します。
$filename = './sample.txt';
$lines = file($filename);
ファイルが存在するかを確認
ファイルが存在するかを確認
file_exits関数は、ファイルが存在するかを確認します。
file_exits($filename);
通常のファイルかどうかを確認
is_file関数は、(ディレクトリではない)通常のファイルかどうかを確認。
is_file($filename);
ファイルが読み書き可能か、実行可能かを確認
is_readable関数は、ファイルが読み取り可能かを確認します。
is_readable($filename);
is_writable関数は、ファイルが書き込み可能かを確認します。
is_writable($filename);
is_executable関数は、ファイルが実行可能かを確認します。
is_executable($filename);
ファイルを確認してから処理を進める
論理演算子と組み合わせて、ファイルが存在するか、さらに読み取り可能かを確認後に処理を続行します。
if (! file_exists($filename) || ! is_readable($filename)) {
print 'File is not found. :'.$filename ;
} else {
require("$filename");
}
その他のファイルシステム関数
ファイルサイズを得る
filesize関数は、引数に指定したファイルのファイルサイズ(バイト単位)を返します。
$filename = './sample.txt';
print filesize($filename);
ファイルの最終更新時刻を得る
filetime関数は、引数に指定したファイルの最終更新時刻を返します。date関数と組み合わせて 使用することができます。
$filename = './sample.txt';
print date("Y/m/d H:i:s",filetime($filename));
ファイルをコピーする
copy関数を利用してファイルをコピーします
copy($file_from,$file_to);
ファイル名を変える
rename関数を利用してファイル名を変えます
rename($filename,$filename_new);
ファイルを削除する
unlink関数を利用してファイルを削除します
unlink($filename);
ディレクトリを作成する
mkdir関数を利用してディレクトリを作成します。第二引数はディレクトリのパーミッションです。パーミッションの指定を 省略すると「0777」が指定されます。
mkdir($newdir,0755);
ディレクトリを削除する
rmdir関数を利用してディレクトリを削除します。
rmdir($dirname);
clearstatcache関数
キャッシュされたファイル情報を削除する。
パス情報を分割して取得
pathinfo関数を利用してパス情報を分割して取得します。
$path_array = pathinfo($pathname);
print $path_array('dirname');
print $path_array('basename');
print $path_array('extension');