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
- PHP: is_file - Manual
- PHP: is_dir - Manual
- PHP: file_exists - Manual
- PHP: is_readable - Manual
- PHP: is_writable - Manual
ファイルの読み込み、書き込みの関数
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;
}