※このサンプルの解説は、「CGI(Perl)の解説」をすべて読み終えてる方を前提としています。
後になるほど省略されている場合がありますのでできるだけ順番に読んでください。
また、実行に際しては、サーバーでPHPが利用できる事を前提に解説しています。
■ ファイルの読み書き
今回は「ファイルの読み書き」について説明します。
PHPにはファイルの読み書きについての命令も数多く用意されています。
その中でも私自身がよく使う命令を中心に解説します。
- file_exists((ファイル名))
-
「ファイル名」で指定したファイルまたはディレクトリが存在するかをチェックします。
存在した場合「true」を、存在しない場合「false」を返します。
- filesize((ファイル名))
-
「ファイル名」で指定したファイルのファイルサイズを返します。
- file((ファイル名))
-
「ファイル名」で指定したファイルを読み込み、配列で返す。
- fopen((ファイル名), (モード))
-
「ファイル名」で指定したファイルを「モード」のモードでオープンし、その「ファイルポインタ(ファイルハンドル)」を返します。
「ファイル名」は「ローカルファイル」、「URL」のどちらも利用でき自動認識します。
「モード」は次のようなものがあります。モード 意 味 r 読み込み専用モード r+ 読み込み/書き込み共用モード w 書き込み専用モード w+ 書き込み/読み込み共用モード a 追記専用モード a+ 追記/読み込み共用モード
- feof((ファイルポインタ))
-
「ファイルポインタ」で指定されたファイルが終端(EOF)に達しているかを返す。
終端(EOF)に達している場合「true」を、達していない場合「false」を返します。
- fclose((ファイルポインタ))
-
「ファイルポインタ」で指定されたファイルをクローズ(閉じる)します。
- fread((ファイルポインタ), (文字列長))
-
「ファイルポインタ」で指定されたファイルから指定した「文字列長」のデータを読み込み、その文字列を返します。
- fgets((ファイルポインタ), (文字列長))
-
「ファイルポインタ」で指定されたファイルから「文字列長」以内の文字を1行分読み込み、その文字列を返します。
- fputs((ファイルポインタ), (文字列), (文字列長))
-
下記の「fwrite()」を参照してください。(「fwrite()」と同義)
- fwrite( (ファイルポインタ), (文字列), (文字列長) )
-
「ファイルポインタ」で指定されたファイルに「文字列長」以内の「文字列」を書き込みます。
上記以外の「ファイル関数」や、詳しい説明は「PHP関連のサイト」 のリファレンスの「ファイルシステム関数」に詳しく解説されてますので、そちらを参照してください。
◆ファイルが存在するかどうかチェックする
指定したファイルが存在するかどうかは次のようにして確認できます。
- 【記述サンプル】
- if (file_exists("test.txt")){ print "ファイルが見つかりました。"; }else{ print "ファイルが見つかりません!"; }
◆ファイルへの書き込み
ファイルに対する単純な書き込み(文字列などの書き込み)は次のように記述します。
- 【記述サンプル】
- $fp = fopen("test.txt", "w"); fputs($fp, "aaa\n"); fclose($fp);
※文字列の最後、「\n」はファイル内の改行を意味します。
既にファイルが存在してて、追記書き込みをしたい場合は次のように記述します。
- 【記述サンプル】
- $fp = fopen("test.txt", "a"); fputs($fp, "bbb\n"); fclose($fp);
◆ファイルへの読み込み
ファイルに対する単純な読み込みは次のように記述します。
この場合、ファイルのすべての内容が「$filbuf」にセットされます。
- 【記述サンプル】
- $filnam = "test.txt"; $fp = fopen($filnam, "r"); $filbuf = fread($fp, filesize($filnam); fclose($fp);
※この場合、ファイル名は繰り返し使用しますので「$filnam」という変数にセットして利用しています。
ファイルを1行単位で読み込む簡単な方法は次のように「file()」関数を使用する方法です。
この場合、ファイルの内容は1行単位に区切られながら「$fulbuf」に配列データとしてセットされます。
- 【記述サンプル】
- $filnam = "test.txt"; $filbuf = file($filnam);
また、ファイルを1行単位でひとつひとつ読み込む方法には次のような手順を使います。
この場合、文字列は「1024バイト」以下であるという指定をしています。
- 【記述サンプル】
- $filnam = "test.txt"; $fp = fopen($filnam,"r"); while(!feof($fp)){ print fgets($fp,1024); } fclose($fp);
この方法は1行単位の読み込みをファイルの終端(終わり)まで繰り返す方法です。
こちらの処理は、1行ずつその内容をチェックしたり変更したりするのに向いてます。
◆ファイルの読み書きに対するテスト
上記のサンプルを使い、具体的なファイルの読み書きをテストしてみましょう。
記述サンプルは次のようになります。
- 【記述サンプル】
- <?php print <<< END_DOC <HTML> <HEAD> <title>ファイルの読み書き</title> </HEAD> <BODY> END_DOC; $filnam = "fopenf.cgi"; if (file_exists($filnam)){ print "ファイルが見つかりました。"; }else{ print "ファイルが見つかりません!"; } $fp = fopen($filnam,"w"); fputs($fp,"aaa\n"); fclose($fp); $fp = fopen($filnam,"a"); fputs($fp,"bbb\n"); fclose($fp); $fp = fopen($filnam,"r"); $filbuf = fread($fp,filesize($filnam)); fclose($fp); print "<pre>"; print "「fread(\$fp,filesize(\$filnam))」を利用した読み込み\n"; print "$filbuf"; print "</pre>"; $filbuf = file($filnam); print "<pre>"; print "「file(\$filnam))」を利用した読み込み\n"; foreach($filbuf as $str0){ print "$str0"; } print "</pre>"; $fp = fopen($filnam,"r"); print "<pre>"; print "「fgets(\$fp,1024)」を利用した読み込み\n"; while(!feof($fp)){ print fgets($fp,1024); } print "</pre>"; fclose($fp); if (file_exists($filnam)){ print "ファイルが見つかりました。"; }else{ print "ファイルが見つかりません!"; } print <<< END_DOC </BODY> </HTML> END_DOC; ?>
※繰り返し命令の「foreach()」、「while(){ }」については別の機会に解説します。
◆ファイルの読み書きに対するテストの実行結果
最後に記述した上記のサンプルを「filopen.php」という名前で保存して実行してみてください。
実行結果はこちらをクリックしてください。
なお、実行結果については、各々のサーバーの環境、ユーザーの環境にによって内容は変わってきます。