CodeLog

PHPでよく使うファイル操作関数

2020-07-17 PHP

備忘録として、PHPで使えるファイル操作の関数をまとめていきます。

PHPにおけるファイル名のパスについて

PHPのファイル操作関数の説明の前に、PHPのファイル名の指定方法について解説していく。

PHPのファイル操作では、絶対パス・相対パスのどちらでもファイルを指定することができる。例えば、fopen('test.txt', 'r')fopen('./test/txt', 'r')とすれば現在のパスにあるtest.txtを読み込んでくれる。

また、fopen('../test.txt', 'r')fopen('temp/test.txt', 'r')とすることで異なるパスのファイルも読み込んでくれる。

ファイルの存在を確認する関数

ファイルの存在を確認する関数には、主に以下の5つがある。

is_file ( string $filename ) : bool
is_dir ( string $filename ) : bool
file_exists ( string $filename ) : bool
is_readable ( string $filename ) : bool
is_writable ( string $filename ) : bool

is_file(string $filename)はファイルが存在するかをチェックし、is_dir ( string $filename )は指定したディレクトリが存在するかをチェックする。ファイル、ディレクトリのいずれでも良い場合は、file_exists ( string $filename )を使うと良い。

先ほど挙げた3つはファイル又はディレクトリが存在するかのみをチェックするが、ファイルが存在してかつ読み込み(書き込み)可能かもチェックしたい場合は、以下の2つの関数を使う。

is_readable ( string $filename ) : bool
is_writable ( string $filename ) : bool

ファイルの読み込み、書き込みの関数

fopen ( string $filename , string $mode [, bool $use_include_path = FALSE [, resource $context ]] ) : resource
fread ( resource $handle , int $length ) : string
fwrite ( resource $handle , string $string [, int $length ] ) : int
fgetc ( resource $handle ) : string
fgets ( resource $handle [, int $length ] ) : string

fopen

fopen ( string $filename , string $mode [, bool $use_include_path = FALSE [, resource $context ]] ) : resource

fopenの使い方はC言語のfopenと非常に似ており、$fp = fopen('test.txt', 'r')の様に使う。

しかし、読み込みエラー時の処理のやり方が少々異なっており、C言語の場合は

if((fp = fopen("test.txt", "r")) == NULL){
    exit(1);
}

のようにファイルポインタがNULLかどうかでチェックすれば良かったが、PHPで同じような処理を書くとWarningが無駄に出てしまう。

これを回避するために、PHPではis_readble()is_writable()でファイルの読み書きができるかをチェックすると良い。

fread

fread ( resource $handle , int $length ) : string

指定した$lengthまでの最大文字列を返してくれる関数。最大文字数列を返してくれるので、第2引数で指定した文字数よりも多いか少ないかと言うのを気にする必要はない。

例えば、以下の様に書く。

<?php

$fp = fopen("test.txt", "r");
while (1) {
    $result = fread($fp, 3);

    if ($result == NULL) {
        break;
    }

    echo $result . "\n";
}

fwrite

function fwrite_stream($fp, $string) {
    for ($written = 0; $written < strlen($string); $written += $fwrite) {
        $fwrite = fwrite($fp, substr($string, $written));
        if ($fwrite === false) {
            return $written;
        }
    }
    return $written;
}