【PHP】ファイルを開く関数「fopen()」、ファイルを閉じる関数「fclose」
今回はPHPで使用できる、メモ帳などのファイルを開いたり閉じたりする関数、「fopen()」と「fclose()」を使用してみます。
ファイル操作の起点となるPHP関数なので、ファイルの読み込み、書き込みをするためには必須の関数です。
目次
ファイルを開く関数「fopen()」
|
1 |
fopen(読み込みたいファイル名 , 開くモード); |
第二引数に、ファイルを開くモードを設定します。このファイルを開くモードによってファイル内の内容を取得したり、ファイル内にデータを書き込んだりします。モードとの組み合わせによっては、読み込もうとしたファイルが存在しない場合、第一引数に設定した名称でファイルを新規作成します。
「fopen()」のモード
| モード | 動作 | ファイルポインタ | ファイルが存在しない場合 |
|---|---|---|---|
| r | 読み込みのみでオープン。 | 先頭 | エラー |
| r+ | 読み込み/書き出し用にオープン。 | 先頭 | エラー |
| w | 書き出しのみでオープン。 ファイルサイズをゼロにしてデータを書き込む。 |
先頭 | ファイルを新規作成 |
| w+ | 読み込み/書き出し用にオープン。 ファイルサイズをゼロにしてデータを書き込む。 |
先頭 | ファイルを新規作成 |
| a | 書き出しのみでオープン。 データは追記で書き込みを行う。 |
末尾 | ファイルを新規作成 |
| a+ | 読み込み/書き出し用にオープン。 データは追記で書き込みを行う。 |
末尾 | ファイルを新規作成 |
| x | 書き出しのみでオープン。 ファイルを新規作成しデータを書き込む。 |
先頭 | エラー(※この関数はファイルが存在する場合にエラーが発生) |
| x+ | 読み込み/書き出し用にオープン。 ファイルを新規作成しデータを書き込む。 |
先頭 | エラー(※この関数はファイルが存在する場合にエラーが発生) |
| c | 書き出しのみでオープン。 ファイル内のデータはそのままで追記。 |
先頭 | ファイルを新規作成 |
| c+ | 読み込み/書き出し用にオープン。 ファイル内のデータはそのままで追記 |
先頭 | ファイルを新規作成 |
これらのモードを第二引数に設定することで、ファイルのデータを取得したり、書き込んだりすることができます。
各モードの動作を確認する為に、サンプルコードとサンプルファイルを用意しましょう。
今回はメモ帳を使用したサンプルファイル「test.txt」を用意し、ファイル内に「123」というデータを記述し保存します。
サンプルコード:モード「”r”」
「”r”」はファイルを読み込み、データを取得するモードです。サンプルファイル「test.txt」からデータを取得してみます。
「fopen()」の「”r”」モードはあくまでデータの読み込みようでファイルを開く関数であり、データの取得は「fgets()」関数で行います。
|
1 2 3 4 5 6 7 8 9 10 11 |
<?php //fopen(読み込みたいファイル名 , 開くモード); $file = fopen("test.txt" , "r"); //モード「"r"」でファイルをオープン $test = fgets($file); //メモ帳のデータを一行分取得し「$test」に格納する fclose($file); //ファイルを閉じる echo $test; //「$test」を出力する //実行結果 //123 ?> |
メモ帳内のデータを取得し、変数に格納、出力するすることが確認できました。
サンプルコード:モード「”w”」
「”w”」はファイルを書き出し用でファイルをオープンします。書き出し用のモードは他にもありますが、「”w”」の特徴は「ファイルサイズを一度ゼロにしてからデータを書き出す」ことです。「メモ帳のファイル内を白紙に戻してから記述する」という動作と考えれば分かりやすいかもしれません。
|
1 2 3 4 5 6 7 8 9 10 |
<?php //fopen(読み込みたいファイル名 , 開くモード); $file = fopen("test.txt" , "w"); //モード「"w"」でファイルをオープン fwrite($file , "one\n"); //「$file」に「"one"」を書き込む fwrite($file , "two\n"); //「$file」に「"two"」を書き込む fwrite($file , "three\n"); //「$file」に「"three"」を書き込む fclose($file); //ファイルを閉じる ?> |
ブラウザを読み込んでプログラムを実行します。メモ帳のファイルが以下のように書き換わっているはずです。
メモ帳に保存されていた「123」がなくなり、「fwrite()」によって文字列が書き込まれています。「fopen(“test.txt” , “w”)」でファイルを開いた時点で、ファイル内のデータが白紙になっていることがモード「”w”」の特徴的な動作なんですね。
サンプルコード:モード「”a”」
モード「”a”」は「”w”」と同じ書き出し用でオープンしますが、ファイル内のデータはそのままで、データの末尾から書き出しを行っていきます。
|
1 2 3 4 5 6 7 8 9 10 |
<?php //fopen(読み込みたいファイル名 , 開くモード); $file = fopen("test.txt" , "a"); //モード「"a"」でファイルをオープン fwrite($file , "one\n"); //「$file」に「"one"」を書き込む fwrite($file , "two\n"); //「$file」に「"two"」を書き込む fwrite($file , "three\n"); //「$file」に「"three"」を書き込む fclose($file); //ファイルを閉じる ?> |
ブラウザを一回読み込んで、プログラムを実行します。実行結果として「test.txt」内のデータを確認します。
モード「”a”」は末尾からデータをどんどん追記していきます。モード「”w”」のようにデータを初期化しないので、データを蓄積していくプログラムに適しています。どんどん追記していくので、ブラウザを再び読み込んでみると以下のようになります
サンプルコード:モード「”x”」
モード「”x”」は書き込み用でファイルをオープンというより、「ファイルを新規作成」してオープンします。
この動作の為、他のモードとは少し違い、第一引数に指定したファイルが存在する場合にエラーとなります。
情報の送信を1回だけで完結させ、追記などをさせたくない場合のプログラム作成に適しています。
ユーザー情報等のファイル作成にむいているかもしれませんね。
|
1 2 3 4 5 6 7 8 9 10 |
<?php //fopen(読み込みたいファイル名 , 開くモード); $file = fopen("test.txt" , "x"); //モード「"x"」でファイルをオープン fwrite($file , "one\n"); //「$file」に「"one"」を書き込む fwrite($file , "two\n"); //「$file」に「"two"」を書き込む fwrite($file , "three\n"); //「$file」に「"three"」を書き込む fclose($file); //ファイルを閉じる ?> |
実行結果です。
エラーが発生してしまいました。これは同じフォルダ内に第一引数に設定したファイル名、今回で言えば「test.txt」が存在する為に発生しました。「text.txt」を削除してから再度プログラムを実行してみます。
「test.txt」が新たに作成され、ファイル内のデータは指定した文字列が書き込まれていることが確認できました。
サンプルコード:モード「”c”」
モード「”c”」は書き込み用でファイルをオープンし、ファイルポインタを先頭に設定します。「”w”」のようにファイルを白紙にしたりせず、データを書き込んでいきますが、諸注意として、ファイルの先頭のデータを上書きしていく点が挙げられます。動作を確認する為にメモ帳のファイルを以下のように書き換えてみましょう。
つづいてサンプルコードを実行します。
|
1 2 3 4 5 6 7 8 9 10 |
<?php //fopen(読み込みたいファイル名 , 開くモード); $file = fopen("test.txt" , "c"); //モード「"c"」でファイルをオープン fwrite($file , "one\n"); //「$file」に「"one"」を書き込む fwrite($file , "two\n"); //「$file」に「"two"」を書き込む fwrite($file , "three\n"); //「$file」に「"three"」を書き込む fclose($file); //ファイルを閉じる ?> |
実行結果です。
ファイルポインタの先頭から上書きでデータが書き換えられていきます。
ファイルを閉じる関数「fclose」
|
1 |
fclose(閉じるファイル名); |