Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】RecursiveDirectoryIterator::getRealPath()メソッドの使い方

getRealPathメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

getRealPathメソッドは、RecursiveDirectoryIteratorクラスに属するメソッドです。このメソッドは、現在処理中のファイルやディレクトリについて、「正規化された絶対パス」を取得するために使用されます。

「正規化された絶対パス」とは、シンボリックリンク(別のファイルやディレクトリへのショートカットのようなもの)が存在する場合に、それが実際に指し示している元の物理的なパスを特定し、さらにパスに含まれる「.」(現在のディレクトリ)や「..」(親ディレクトリ)といった相対的な要素をすべて解決して、システム上で一意に決まる完全なパスを指します。

具体的には、たとえば、ファイルがシンボリックリンクであった場合、getRealPathメソッドはそのシンボリックリンク自身のアドレスではなく、そのリンクが指し示す実際のファイルのパスを返します。これにより、ファイルの実体を正確に把握することができます。

このメソッドは、ファイルやディレクトリの操作を行う際に、パスの曖昧さをなくし、実際の物理的な位置を確実に特定したい場合に非常に役立ちます。特に、セキュリティ上の理由や、異なるシステム間で正確なパス情報が必要となる場面で、その真価を発揮します。PHP 8では、通常、文字列として正規化された絶対パスが返されますが、指定されたパスが存在しないなど、解決できない状況ではfalseが返されることがあります。

構文(syntax)

1<?php
2
3$targetDirectory = __DIR__;
4
5$directoryIterator = new RecursiveDirectoryIterator($targetDirectory);
6
7foreach ($directoryIterator as $fileInfoObject) {
8    $absolutePath = $fileInfoObject->getRealPath();
9}

引数(parameters)

引数なし

引数はありません

戻り値(return)

string|false

RecursiveDirectoryIterator::getRealPathメソッドは、対象となるファイルまたはディレクトリの絶対パスを文字列で返します。ただし、パスが存在しない、またはアクセスできない場合はfalseを返します。

サンプルコード

PHP RecursiveDirectoryIterator getRealPath()でリアルパスを取得する

1<?php
2
3/**
4 * 指定されたディレクトリを再帰的に走査し、各ファイル/ディレクトリのリアルパスを表示します。
5 *
6 * システムエンジニアを目指す初心者向けに、PHPのファイルシステム操作の基本である
7 * RecursiveDirectoryIterator と getRealPath() メソッドの使用法を示します。
8 *
9 * Laravelのようなフレームワークを使用している場合でも、基盤となるPHPのファイルシステム機能は
10 * 同様に利用できます。例えば、Laravelプロジェクト内の 'public' ディレクトリや
11 * 'storage/app' ディレクトリの内容を走査し、シンボリックリンクを解決した
12 * 実際のファイルパス(リアルパス)を取得する際に役立ちます。
13 *
14 * @param string $directoryPath 走査するディレクトリのパス
15 * @return void
16 */
17function walkDirectoryAndGetRealPaths(string $directoryPath): void
18{
19    // 指定されたパスがディレクトリでない場合はエラーメッセージを表示して終了
20    if (!is_dir($directoryPath)) {
21        echo "エラー: 指定されたパス '{$directoryPath}' は有効なディレクトリではありません。\n";
22        echo "このサンプルを実行する前に、存在するディレクトリパスを指定してください。\n";
23        echo "例: Laravelプロジェクトの 'public' ディレクトリ ('/path/to/your-laravel-app/public')\n";
24        return;
25    }
26
27    echo "ディレクトリ '{$directoryPath}' 内のアイテムとリアルパス:\n";
28
29    try {
30        // RecursiveDirectoryIterator を使用してディレクトリを再帰的に走査します。
31        // RecursiveDirectoryIterator::SKIP_DOTS は '.' (現在のディレクトリ) と '..' (親ディレクトリ) をスキップします。
32        $directoryIterator = new RecursiveDirectoryIterator($directoryPath, RecursiveDirectoryIterator::SKIP_DOTS);
33
34        // RecursiveIteratorIterator は、RecursiveDirectoryIterator と組み合わせて
35        // ディレクトリツリー全体(サブディレクトリ含む)を深く走査するために使用します。
36        // RecursiveIteratorIterator::SELF_FIRST は、サブディレクトリの内容より先に
37        // ディレクトリ自体を返すようにします。
38        $iterator = new RecursiveIteratorIterator($directoryIterator, RecursiveIteratorIterator::SELF_FIRST);
39
40        foreach ($iterator as $item) {
41            // RecursiveDirectoryIterator::getRealPath() は、現在のイテレータが指す
42            // ファイルまたはディレクトリのシンボリックリンクを解決した完全な物理パスを返します。
43            // パスが存在しない、またはアクセス権がない場合は false を返します。
44            $realPath = $item->getRealPath();
45
46            // リアルパスが正常に取得できたか確認
47            if ($realPath !== false) {
48                // ファイルまたはディレクトリのパス名とリアルパスを表示
49                // getPathname() は元のパス、getRealPath() は解決された物理パスです。
50                echo "  - オリジナルパス: " . $item->getPathname() . "\n";
51                echo "    リアルパス:     " . $realPath . "\n";
52            } else {
53                // リアルパスの取得に失敗した場合
54                echo "  - オリジナルパス: " . $item->getPathname() . "\n";
55                echo "    リアルパスの取得に失敗しました (ファイルが存在しないかアクセス権の問題の可能性)。\n";
56            }
57        }
58    } catch (RuntimeException $e) {
59        // ディレクトリへのアクセス権がない、またはその他のファイルシステムエラーを捕捉
60        echo "エラーが発生しました: " . $e->getMessage() . "\n";
61    }
62}
63
64// -----------------------------------------------------------------------------
65// サンプル実行
66// -----------------------------------------------------------------------------
67
68// ここに、実際に存在するディレクトリのパスを指定してください。
69// 例として、このスクリプトが存在するディレクトリをデフォルトとしますが、
70// 実際にはLaravelプロジェクト内のパスなどに変更してください。
71//
72// 例: Laravelプロジェクトの `public` ディレクトリ
73// $targetDirectory = '/path/to/your-laravel-app/public';
74//
75// テストのために、以下のコマンドで一時的なディレクトリとファイルを作成してから実行すると便利です。
76// (Linux/macOSの場合)
77// mkdir -p /tmp/my_test_dir/sub_folder
78// touch /tmp/my_test_dir/file1.txt
79// touch /tmp/my_test_dir/sub_folder/file2.log
80// ln -s /tmp/my_test_dir/file1.txt /tmp/my_test_dir/symlink_to_file1.txt
81//
82// その後、$targetDirectory を '/tmp/my_test_dir' に設定して実行してください。
83$targetDirectory = __DIR__; 
84
85// 関数を呼び出してディレクトリを走査し、リアルパスを取得します。
86walkDirectoryAndGetRealPaths($targetDirectory);

PHPのgetRealPath()メソッドは、RecursiveDirectoryIteratorクラスに属し、ファイルやディレクトリのシンボリックリンクを解決した実際の物理パス(リアルパス)を取得する際に利用されます。このメソッドは引数を取りません。戻り値は、リアルパスが正常に取得できた場合は文字列としてパスを返し、失敗した場合はfalseを返します。

サンプルコードでは、RecursiveDirectoryIteratorRecursiveIteratorIteratorを使い、指定されたディレクトリをサブディレクトリ含め再帰的に走査します。走査中に見つかる各ファイルやディレクトリに対してgetRealPath()を呼び出し、元のパス名とシンボリックリンクが解決された後の物理的なパスを表示しています。これにより、シンボリックリンクを含む複雑なファイル構造であっても、ファイルやディレクトリの実際の保存場所を正確に把握することが可能です。Laravelなどのフレームワークを利用したプロジェクトでも、ファイルの物理的な位置を特定する基礎的な機能として活用できます。

RecursiveDirectoryIterator::getRealPath()メソッドは、シンボリックリンクを解決したファイルやディレクトリの物理パスを返しますが、対象が存在しない場合やアクセス権がない場合はfalseを返します。そのため、戻り値がfalseでないかを必ず確認し、適切に処理を分岐させてください。ファイルシステムへのアクセスは、予期せぬエラー(アクセス権不足など)が発生しやすいため、try-catchブロックでRuntimeExceptionを捕捉し、エラーハンドリングを行うことが非常に重要です。サンプルコードの$targetDirectoryには、実際に存在するディレクトリの絶対パスを指定してください。特にLaravelのようなフレームワーク環境では、public_path()などのパスヘルパーを利用すると、環境に依存しない安全なパス指定が可能です。

関連コンテンツ

関連IT用語

関連プログラミング言語