第9章 ファイルとディレクトリ操作

ファイルの読み書き

ファイルの読み書きにはfile_get_contents()file_put_contents()がよく使われます。

// ファイルの読み込み
$content = file_get_contents('file.txt');
echo $content; // ファイルの内容が表示されます

// ファイルへの書き込み
$newContent = 'こんにちは、世界!';
file_put_contents('file.txt', $newContent);


ファイルの作成と削除

ファイルの作成にはtouch()、削除にはunlink()が使われます。

// ファイルの作成
touch('newfile.txt');

// ファイルの削除
unlink('newfile.txt');


ファイル情報の取得

ファイルのサイズや更新時間などの情報を取得するには、filesize(),filemtime()などの関数が使われます。

// ファイルサイズの取得
$size = filesize('file.txt');
echo $size; // ファイルサイズが表示されます

// ファイルの最終更新時間の取得
$time = filemtime('file.txt');
echo date('Y-m-d H:i:s', $time); // 更新時間が表示されます


ディレクトリの作成と削除

ディレクトリの作成にはmkdir()、削除にはrmdir()が使われます。

// ディレクトリの作成
mkdir('newdir');

// ディレクトリの削除
rmdir('newdir');


ディレクトリ内のファイル一覧取得

ディレクトリ内のファイル一覧を取得するにはscandir()が使われます。

// ディレクトリ内のファイル一覧の取得
$files = scandir('.');
foreach ($files as $file) {
    echo $file . "\n"; // ファイル名が表示されます
}


ファイルを開く/閉じる

fopen()は、ファイルの読み書きモードを指定してファイルを開きます。一方、fclose()は開いたファイルを閉じます。

// ファイルを開く
$fp = fopen('file.txt', 'r'); // 'r'は読み取りモードを意味します

// 処理...

// ファイルを閉じる
fclose($fp);


開いたファイルの読み書き

開いたファイルからデータを読み込んだり、データを書き込んだりするための関数です。

$fp = fopen('file.txt', 'r');

// ファイルからデータを読み込む
$content = fread($fp, filesize('file.txt'));
echo $content; // ファイルの内容が表示されます

fclose($fp);
$fp = fopen('file.txt', 'w');

// ファイルへデータを書き込む
fwrite($fp, 'こんにちは、世界!');

fclose($fp);


存在をチェックする

指定したパスのファイルまたはディレクトリが存在するかどうかをチェックします。

if (file_exists('file.txt')) {
    echo 'ファイルが存在します。';
} else {
    echo 'ファイルが存在しません。';
}
if (file_exists('dir')) {
    echo 'ディレクトリが存在します。';
} else {
    echo 'ディレクトリが存在しません。';
}


権限をチェックする

ファイルが読み込み可能か、書き込み可能かをチェックします。

if (is_readable('file.txt')) {
    echo 'ファイルは読み込み可能です。';
} else {
    echo 'ファイルは読み込み不可能です。';
}

if (is_writable('file.txt')) {
    echo 'ファイルは書き込み可能です。';
} else {
    echo 'ファイルは書き込み不可能です。';
}


ファイル名の変更

rename()はファイルの名前を変更します。

if (rename('oldname.txt', 'newname.txt')) {
    echo 'ファイル名を変更しました。';
} else {
    echo 'ファイル名を変更できませんでした。';
}


ファイルのコピー

copy()はファイルをコピーします。

if (copy('source.txt', 'destination.txt')) {
    echo 'ファイルをコピーしました。';
} else {
    echo 'ファイルをコピーできませんでした。';
}


ファイルを配列として読み込む

ファイルを読み込み、その結果を配列として返します。配列の各要素はファイルの各行に対応します。

Hello, world!
This is an example file.
It has three lines.
// "example.txt"というファイルを開き、その内容を配列として取得します。
$lines = file('example.txt');

// 配列の各要素(つまりファイルの各行)を出力します。
foreach ($lines as $line) {
    echo $line;
}

// 出力結果
Hello, world!
This is an example file.
It has three lines.


ファイルのロック

ファイルのロックとは、ファイルに対するアクセスを同期する方法の一つです。ロックを使用することで、同時に同じファイルにアクセスしようとする複数のプロセスやスクリプト間でデータの整合性を保つことができます。

例えば、あるファイルが同時に2つのプロセスによって書き込まれると、データが混在したり上書きされたりする可能性があります。これを防ぐために、flock()関数を用いて一度に1つのプロセスだけがファイルに書き込みできるように制御することができます。

以下にflock()の使用例を示します

$file = fopen("file.txt", "w");
if (flock($file, LOCK_EX)) { // 排他的ロックを取得
    fwrite($file, "Hello, World!\n");
    fflush($file); // データをディスクに書き出す
    flock($file, LOCK_UN); // ロックを解放
} else {
    echo "Could not lock the file!";
}
fclose($file);

この例では、flock()関数を使用して排他的ロック(他のプロセスが同じファイルを読み書きできないようにする)を取得しています。書き込みが完了したらflock()関数を再度使用してロックを解放します。

しかし、全てのファイル操作にflock()が必要というわけではありません。ファイルに対する同時アクセスが考えられる場合や、データの整合性が重要な場合に限り使用するべきです。一方で、読み取り専用のファイルアクセスや、一度だけ書き込むようなシナリオでは、flock()を使用する必要はありません。


練習問題1.

以下の手順に従って、テキストファイルを作成し、何かのメッセージを書き込んでみてください。

'test.txt'という名前のテキストファイルを作成します。

ファイルに 'Hello, world!' という文字列を書き込みます。

ファイルを閉じます。


練習問題2.

上記の問題で作成したファイルを開いて内容を読み込み、それを出力するプログラムを作成してみてください。


練習問題3.

ディレクトリを作成し、その後削除するプログラムを作成してみてください。ただし、削除する前にディレクトリが存在することを確認してください。