PHPまとめ - ファイル読み書き

HOME | TOP

■ ファイルを読み込む

▼ 開いて閉じる、これ基本

ファイルを読むために、まずオープンする。その際にファイルの読み込み位置情報を持つファイルポインタを受け取る。

そしてオープンしたら必ずクローズする。エチケットです。

実際にはfopen()した後に、読み込んではいろいろな処理をしたりして、最後にfclose()の流れになります。



▼ 一行ずつ読み込む(バグかも知れない版)

"rb"はWindows環境における読み込みモード指定です。
Windows以外の環境でこう書いても恐らく悪さしないのでこう書くクセをつけておきます。

で、バグかも知れないと言うのはなにかと言うと、ファイル内容が10行あったとすると、10行目終わりでファイルエンドを検出できずに11行目まで読みに行こうと試みた後にファイルエンドを検出します。

ということで回避方法を考えます。



▼ 一行ずつ読み込む(バグ回避版)

fgets()関数が読み込みに失敗もしくはファイルエンドに到達したらfalseを返すことを利用します。一応これでうまくいくようになりました。

ここで本題に入ります。もしターゲットのファイルが存在しなかった場合にいきなりfopen()で開こうとすると警告が表示されます。(設定によります)

これを回避する必要があります。



▼ 一行ずつ読み込む(警告回避版)

is_readable()関数を使ってファイルが読めるか事前にチェックしています。この関数はもしファイルが存在していなくても偽を返すだけで警告等は表示しません。

is_readable()以外ではよくfile_exists()関数が使われます。

処理条件のチェックは先にくくり出して、条件を満たさなければそこでプログラムを完結させておくと、先々ごちゃごちゃならずに済みます。(私的鉄則)
ということで以下の実践版を最終的なものとします。



▼ 一行ずつ読み込む(実践版)

チェック部分を先にくくり出すと、ネスト(字下げ)も深くならないので見やすくなります。



次に、ファイル内容を一気にすべて読み込む書き方です。

当然のことながら一気に読む場合は事前にファイルサイズが処理に耐えられる程度かどうか分かってる上でやる必要があります。大容量ファイルだとメモリその他が対応しきれなくてエラーになるでしょう。



▼ ファイルを一気に読み込む

maxsizeは固定値なのでdefine("MAXSIZE", (1024*1024*1))で定数定義してもよい。

実はすべて読み込むため専用のfile_get_contents()関数が用意されている。

ただし、これもファイルが読めるかどうかを事前にチェックしておかないと、読めない場合に警告が出てしまう。



▼ ファイルを一気に読み込む(file_get_contentsを使った例)

▼ ファイルを配列に読み込む

■ ファイルに書き込む

▼ 開いて閉じる、これ基本

"wb"はWindows環境の場合にバイナリモードで書き込む指定方法になります。
Windows以外の環境でこれを書いても悪さしないようなのでこう書くクセをつけておきます。

また、追加書き込み(ファイルがなければ新規作成)する場合のモード指定は"ab"となります。



▼ ファイル書き込み

例によって事前に書き込めるかどうかチェックしたくなりますが、書き込みの場合は設置場所の書き込み権限があることを最初に確認できていれば細かなチェックまではしなくても書けない場合はそれまでということでいいと思います。

ということで以下のように書き換えます。



▼ ファイル書き込み(改変版)

書き込みにはfwrite()関数を使っています。fputs()はエイリアスなのでfputs()でも同じになります。

書き込みもまた、専用のfile_put_contents()関数が用意されています。



▼ ファイル書き込み(file_put_contentsを使った例)

第三引数に「FILE_APPEND」を指定すると追記モードで書き込めます。
「LOCK_EX」を指定すると排他ロックをします。




2010(C)Mingw