【PHP8.x】file_exists関数の使い方

file_exists関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

file_exists関数は、指定されたパスにファイルまたはディレクトリが存在するかどうかを確認する関数です。この関数は、PHPスクリプトが特定のファイルやディレクトリを操作する前に、その対象がファイルシステム上に実際に存在するかどうかを検証する目的で広く利用されます。

引数としては、存在を確認したいファイルまたはディレクトリへのパスを文字列で指定します。このパスは、絶対パス(例えば、/var/www/html/data.txt)でも、現在のスクリプトからの相対パス(例えば、../config/settings.ini)でも指定可能です。

関数は、指定されたパスにファイルまたはディレクトリが存在すれば真(true)を、存在しなければ偽(false)をブール値として返します。この戻り値を利用することで、「ファイルが存在する場合のみ読み込む」「ディレクトリが存在しない場合のみ作成する」といった条件分岐を安全に記述し、プログラムの予期せぬエラーを防ぐことができます。

例えば、ユーザーからの入力としてファイル名を受け取った際に、そのファイルが実際に存在するかどうかを事前に確認するために利用されます。また、システムの設定ファイルやログファイルが存在するかをチェックし、存在しない場合は適切な初期化処理を行うといった応用も可能です。この関数は、ファイル操作におけるエラーを未然に防ぎ、プログラムの安定性を高める上で非常に重要な役割を果たします。

構文(syntax)

1$fileExists = file_exists('path/to/your/file.txt');

引数(parameters)

string $filename

  • string $filename: 存在を確認したいファイルまたはディレクトリのパスを指定する文字列

戻り値(return)

bool

指定されたファイルが存在するかどうかを判定し、存在すれば true を、存在しなければ false を返します。

サンプルコード

PHP: file_exists が「存在するのに」false を返す理由

1<?php
2
3/**
4 * PHPのfile_exists関数の動作を理解するためのサンプルコードです。
5 * 特に「ファイルが存在するはずなのにfile_existsがfalseを返す」といった状況の原因を探ります。
6 * これは、パスの指定ミスや相対パスの基準点の違いによって起こりやすいです。
7 */
8function demonstrateFileExistsBehavior(): void
9{
10    // 一時ファイル名を生成し、現在のスクリプトと同じディレクトリに配置
11    $tempFileName = 'my_test_file.txt';
12    $currentDir = __DIR__;
13    $fullPathToFile = $currentDir . DIRECTORY_SEPARATOR . $tempFileName;
14
15    echo "--- file_exists関数の動作デモンストレーション ---" . PHP_EOL . PHP_EOL;
16
17    // 1. ファイルを実際に作成し、存在確認するケース
18    // この操作でファイルが物理的にディスク上に作成されます
19    file_put_contents($fullPathToFile, 'Hello, PHP file_exists!');
20    echo "ケース1: ファイルが実際に存在する場合" . PHP_EOL;
21    echo "作成したファイルのパス: {$fullPathToFile}" . PHP_EOL;
22    if (file_exists($fullPathToFile)) {
23        echo "結果: '{$fullPathToFile}' は存在します (期待通り)" . PHP_EOL;
24    } else {
25        echo "結果: '{$fullPathToFile}' は存在しません (予期せぬエラー)" . PHP_EOL;
26    }
27    echo PHP_EOL;
28
29    // 2. 存在しないファイルパスを指定するケース
30    $nonExistentPath = $currentDir . DIRECTORY_SEPARATOR . 'non_existent_file.txt';
31    echo "ケース2: 存在しないファイルパスを指定した場合" . PHP_EOL;
32    echo "指定したパス: {$nonExistentPath}" . PHP_EOL;
33    if (file_exists($nonExistentPath)) {
34        echo "結果: '{$nonExistentPath}' は存在します (予期せぬエラー)" . PHP_EOL;
35    } else {
36        echo "結果: '{$nonExistentPath}' は存在しません (期待通り)" . PHP_EOL;
37    }
38    echo PHP_EOL;
39
40    // 3. 「存在するのにfile_existsがfalseを返す」状況のシミュレーション
41    // これは、ファイルパスの記述ミス(例: 存在しないサブディレクトリへのパス)で発生しやすいです。
42    // 物理的にはファイルがあるのに、指定されたパスにそのファイルが見つからない、という状況です。
43    $misleadingPath = $currentDir . DIRECTORY_SEPARATOR . 'wrong_subdir' . DIRECTORY_SEPARATOR . $tempFileName;
44    echo "ケース3: ファイルは存在するが、指定したパスが間違っている場合" . PHP_EOL;
45    echo "物理的に存在するファイル: {$fullPathToFile}" . PHP_EOL;
46    echo "しかし、間違ったパスで確認: {$misleadingPath}" . PHP_EOL;
47    if (file_exists($misleadingPath)) {
48        echo "結果: '{$misleadingPath}' は存在します (予期せぬ結果 - パスが誤っている可能性があります)" . PHP_EOL;
49    } else {
50        echo "結果: '{$misleadingPath}' は存在しません (期待通り - 指定されたパスにファイルはありません)" . PHP_EOL;
51        echo "   -> 【ポイント】ファイルが物理的に存在していても、パスが正しくなければfile_existsはfalseを返します。" . PHP_EOL;
52        echo "      この状況が「存在するのにfalseが返る」という混乱の原因になることが多いです。パスを確認しましょう。" . PHP_EOL;
53    }
54    echo PHP_EOL;
55
56    // 4. ディレクトリに対してもfile_existsはtrueを返すケース
57    // file_existsはファイルだけでなく、ディレクトリの存在も確認できます。
58    // ファイルかディレクトリかを厳密に区別するには is_file() や is_dir() を使用します。
59    echo "ケース4: ディレクトリパスを指定した場合" . PHP_EOL;
60    echo "指定したディレクトリパス: {$currentDir}" . PHP_EOL;
61    if (file_exists($currentDir)) {
62        echo "結果: '{$currentDir}' は存在します (期待通り - ディレクトリも存在と判定)" . PHP_EOL;
63        if (is_dir($currentDir)) {
64            echo "   -> is_dir() で確認: '{$currentDir}' はディレクトリです。" . PHP_EOL;
65        }
66    } else {
67        echo "結果: '{$currentDir}' は存在しません (予期せぬエラー)" . PHP_EOL;
68    }
69    echo PHP_EOL;
70
71    // 後処理: テストのために作成したファイルを削除します
72    if (file_exists($fullPathToFile)) {
73        unlink($fullPathToFile);
74        echo "クリーンアップ: 一時ファイル '{$tempFileName}' を削除しました。" . PHP_EOL;
75    }
76}
77
78// デモンストレーション関数を実行
79demonstrateFileExistsBehavior();

PHPのfile_exists関数は、指定されたファイルやディレクトリがシステム上に存在するかどうかを調べるために使用されます。引数には確認したいファイルまたはディレクトリのパスを文字列で渡します。そのパスに存在するものが確認できればtrueを、見つからなければfalseを真偽値として返します。

この関数は、ファイルが実際にディスク上に存在し、かつそのパスが正確に指定されていればtrueを返します。例えば、現在のディレクトリに存在するmy_test_file.txtというファイルへのフルパスを指定すれば、期待通りtrueが得られます。一方で、存在しないファイルパスを指定した場合は、正しくfalseが返されます。

特に注意が必要なのは、「ファイルは物理的に存在しているのにfile_existsfalseを返す」という状況です。これは、ファイル自体は存在しても、関数に渡したパスの記述が間違っている場合に発生します。例えば、ファイルが./my_test_file.txtに存在していても、パスを./wrong_subdir/my_test_file.txtのように誤って指定した場合、file_existsfalseを返します。このように、パスの指定ミスが原因で予期せぬ結果となることが多いため、falseが返された際はまずパスが正しいかを確認することが重要です。

なお、file_existsはファイルだけでなく、指定されたパスにディレクトリが存在するかどうかも確認でき、その場合もtrueを返します。ファイルとディレクトリを厳密に区別したい場合は、is_file()is_dir()関数も併せて検討すると良いでしょう。

file_exists関数は、指定されたパスにファイルまたはディレクトリが存在するかを確認します。特に「ファイルが存在するはずなのにfalseが返る」という状況は、ファイルパスの指定ミスが主な原因です。PHPスクリプトが実行される基準点からの相対パスを意識するか、__DIR__のようなマジック定数で絶対パスを構築して利用することで、パスの誤りを防げます。

また、この関数はファイルだけでなくディレクトリの存在も確認するため、ファイルかディレクトリかを厳密に区別したい場合はis_file()is_dir()関数を併用してください。ファイルへのアクセス権限不足や、PHPのファイルステータスキャッシュが古い情報を保持している場合もfalseが返ることがあります。キャッシュをクリアするにはclearstatcache()関数を使用します。一時ファイルを生成する際は、必ず適切な後処理で削除するようにしましょう。

PHP file_exists 存在するのにfalseを検証する

1<?php
2
3/**
4 * file_exists() 関数の挙動を検証するサンプルコード。
5 * 特に「ファイルが存在するのに false を返す」ケースに焦点を当てます。
6 *
7 * この現象は主に以下の原因で発生します。
8 * 1. パスの指定ミス: 相対パスが、PHPスクリプトが実行されたカレントディレクトリ (CWD) からのパスと一致しない。
9 *    例えば、`php /path/to/script.php` で実行した場合、`script.php` 内の相対パスは `/path/to/` ではなく、
10 *    コマンドを実行したディレクトリ(通常はターミナルのディレクトリ)が基準になります。
11 * 2. アクセス権の問題: PHPプロセスがファイルやディレクトリにアクセスする権限がない。
12 */
13function demonstrateFileExistsBehavior(): void
14{
15    // 作成する一時ファイルの名前
16    $filename = 'temp_exists_check.txt';
17    // このスクリプトが配置されているディレクトリの絶対パス
18    $scriptDir = __DIR__;
19    // 作成する一時ファイルの絶対パス
20    $absoluteFilePath = $scriptDir . DIRECTORY_SEPARATOR . $filename;
21    // 存在しないことを確認するためのファイル名
22    $nonExistentFilename = 'non_existent_file.txt';
23
24    echo "--- file_exists() 関数検証開始 ---" . PHP_EOL;
25    echo "現在のスクリプトディレクトリ: " . $scriptDir . PHP_EOL;
26    echo "現在のカレントワーキングディレクトリ (CWD): " . getcwd() . PHP_EOL . PHP_EOL;
27
28    // 1. 検証用の一時ファイルを作成する
29    // file_put_contents() はファイルが存在しない場合は作成し、存在すれば上書きします。
30    if (file_put_contents($absoluteFilePath, 'This is a test file.') === false) {
31        echo "エラー: ファイル '{$absoluteFilePath}' の作成に失敗しました。書き込み権限を確認してください。" . PHP_EOL;
32        return; // ファイル作成失敗時は処理を中断
33    }
34    echo "1. ファイル '{$absoluteFilePath}' を作成しました。" . PHP_EOL . PHP_EOL;
35
36    // 2. 相対パスで file_exists() をチェックする
37    // このケースで false が返される場合、「存在するのに false」という状況が発生します。
38    // その原因は、CWD とスクリプトのディレクトリが異なるため、相対パスが意図しない場所を指していることです。
39    echo "2. 相対パス '{$filename}' で file_exists() をチェック:" . PHP_EOL;
40    if (file_exists($filename)) {
41        echo "   - 成功: 相対パス '{$filename}' でファイルが見つかりました。" . PHP_EOL;
42    } else {
43        echo "   - 失敗: 相対パス '{$filename}' でファイルが見つかりませんでした。" . PHP_EOL;
44        echo "     ヒント: これは「存在するのに false」の典型的なケースです。" . PHP_EOL;
45        echo "     CWD (" . getcwd() . ") に '{$filename}' が存在しない可能性があります。" . PHP_EOL;
46        echo "     ファイルがスクリプトと同じディレクトリにあっても、CWDが異なる場合は相対パスでは見つかりません。" . PHP_EOL;
47    }
48    echo PHP_EOL;
49
50    // 3. 絶対パスで file_exists() をチェックする
51    // __DIR__ を使用すると、常にスクリプトファイル自身のディレクトリを基準にした絶対パスを取得できます。
52    // これにより、CWD の影響を受けずに正確なパスを指定できます。
53    echo "3. 絶対パス '{$absoluteFilePath}' で file_exists() をチェック:" . PHP_EOL;
54    if (file_exists($absoluteFilePath)) {
55        echo "   - 成功: 絶対パス '{$absoluteFilePath}' でファイルが見つかりました。" . PHP_EOL;
56    } else {
57        echo "   - 失敗: 絶対パス '{$absoluteFilePath}' でファイルが見つかりませんでした。" . PHP_EOL;
58        echo "     ヒント: ここで false が返される場合、ファイルが存在しないか、PHPに読み取り権限がない可能性があります。" . PHP_EOL;
59    }
60    echo PHP_EOL;
61
62    // 4. 存在しないファイルで file_exists() をチェックする
63    echo "4. 存在しないファイル '{$nonExistentFilename}' で file_exists() をチェック:" . PHP_EOL;
64    if (file_exists($nonExistentFilename)) {
65        echo "   - 失敗: 予期せずファイル '{$nonExistentFilename}' が存在します。" . PHP_EOL;
66    } else {
67        echo "   - 成功: ファイル '{$nonExistentFilename}' は存在しませんでした。" . PHP_EOL;
68    }
69    echo PHP_EOL;
70
71    // 5. 作成した一時ファイルをクリーンアップする
72    if (file_exists($absoluteFilePath)) {
73        if (unlink($absoluteFilePath)) {
74            echo "5. ファイル '{$absoluteFilePath}' を削除しました。" . PHP_EOL;
75        } else {
76            echo "5. エラー: ファイル '{$absoluteFilePath}' の削除に失敗しました。アクセス権限を確認してください。" . PHP_EOL;
77        }
78    }
79
80    echo PHP_EOL . "--- 検証終了 ---" . PHP_EOL;
81}
82
83// 関数を実行して、file_exists() の挙動を確認します。
84demonstrateFileExistsBehavior();

file_exists関数は、指定されたファイルやディレクトリが存在するかどうかを調べるPHPの関数です。引数には確認したいファイルまたはディレクトリのパスを文字列で指定し、存在すれば論理値の true を、存在しなければ false を返します。

この関数で「ファイルが存在するのに false を返す」という予期せぬ挙動が発生することがあります。主な原因は、パスの指定ミスとPHPプロセスがファイルへのアクセス権限を持っていないことです。

サンプルコードでは、この挙動を検証しています。一時ファイルを作成し、相対パスと絶対パスの両方でfile_existsを呼び出して結果を比較します。相対パスでファイルをチェックする際、PHPスクリプトが実行されたカレントワーキングディレクトリ (CWD) が基準となります。そのため、ファイルがスクリプトと同じディレクトリにあっても、CWDが異なる場合はファイルが見つからずfalseを返すことがあります。これが「存在するのにfalse」の典型的なケースです。

一方、__DIR__マジック定数などを使用して作成した絶対パスでチェックすると、CWDの影響を受けずに正確なファイルの存在確認が可能です。この方法を用いることで、パスの指定ミスによる問題を回避し、確実にファイルの有無を判断できます。

file_exists()関数は、指定されたファイルが存在し、かつPHPプロセスがアクセスする権限を持っている場合にtrueを返します。ファイルが存在するのにfalseが返される主な原因は、相対パスの解釈ミスです。PHPスクリプトが実行されたカレントワーキングディレクトリ(CWD)が基準となるため、スクリプト自身のディレクトリとCWDが異なる場合に意図しないパスを参照することがあります。このため、__DIR__マジック定数などを利用して常に絶対パスで指定することを推奨します。また、PHPプロセスにファイルへの読み取り権限がない場合もfalseが返されるため、権限設定も必ず確認してください。

関連コンテンツ