【PHP8.x】dir()関数の使い方
dir関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
dir関数は、指定されたパスのディレクトリをオープンし、そのディレクトリ内のエントリを操作するためのオブジェクトを返す関数です。この関数は、ディレクトリの読み取り、巻き戻し、およびクローズといった一連の操作を、オブジェクト指向的な方法で実行することを可能にします。
引数には、オープンしたいディレクトリのパスを文字列で渡します。正常にディレクトリがオープンできた場合、dir関数はDirectoryクラスのインスタンスを返します。このDirectoryオブジェクトは、ディレクトリの内容を順番に読み取るためのread()メソッド、ディレクトリポインタを先頭に戻すためのrewind()メソッド、そしてオープンしたディレクトリハンドルを閉じるためのclose()メソッドを持っています。
例えば、ディレクトリ内のファイルやサブディレクトリの名前を一つずつ取得したい場合に、read()メソッドをループ内で繰り返し呼び出すことで、効率的に処理を進めることができます。全ての読み取りが完了したら、close()メソッドを呼び出してリソースを解放することが推奨されます。
もし指定されたディレクトリが存在しない場合や、読み取り権限がないなどの理由でオープンに失敗した場合、dir関数はfalseを返します。そのため、この関数の戻り値は必ず確認し、エラーハンドリングを行うことが重要です。PHP 8では、より明確な型情報と共に、これらの操作が提供されており、ディレクトリ操作を簡潔かつ安全に行うための強力なツールとなります。
構文(syntax)
1<?php 2function dir(string $path): array 3{ 4 return scandir($path); 5} 6 7$directoryContents = dir('/var/www/html'); 8?>
引数(parameters)
string $directory, ?resource $context = null
- string $directory: ディレクトリのパスを指定する文字列
- ?resource $context: ストリームコンテキストを指定するリソース (省略可能)
戻り値(return)
Directory|false
指定されたディレクトリを開いた Directory オブジェクト、またはエラーが発生した場合は false を返します。
サンプルコード
PHPでディレクトリ内容を一覧表示する
1<?php 2 3/** 4 * 指定されたディレクトリ内のファイルとサブディレクトリを一覧表示します。 5 * システムエンジニアを目指す初心者向けに、PHPの組み込み関数 `dir` を使用しています。 6 * 7 * @param string $directoryPath 走査するディレクトリのパス。 8 * @return void 9 */ 10function listDirectoryContents(string $directoryPath): void 11{ 12 // dir関数は指定されたディレクトリを開き、Directoryオブジェクトを返します。 13 // ディレクトリが開けなかった場合は false を返します。 14 $dirHandle = dir($directoryPath); 15 16 if ($dirHandle === false) { 17 echo "エラー: ディレクトリ '{$directoryPath}' を開けませんでした。" . PHP_EOL; 18 return; 19 } 20 21 echo "ディレクトリ '{$directoryPath}' の内容:" . PHP_EOL; 22 23 // read()メソッドはディレクトリ内の次のエントリ名(ファイルまたはディレクトリ)を返します。 24 // 全てのエントリを読み終えると false を返します。 25 while (($entry = $dirHandle->read()) !== false) { 26 // '.' と '..' は特殊なディレクトリ参照なので、通常は表示をスキップします。 27 if ($entry === '.' || $entry === '..') { 28 continue; 29 } 30 31 $fullPath = $directoryPath . DIRECTORY_SEPARATOR . $entry; 32 33 if (is_dir($fullPath)) { 34 echo " [DIR] " . $entry . PHP_EOL; 35 } elseif (is_file($fullPath)) { 36 echo " [FILE] " . $entry . PHP_EOL; 37 } else { 38 echo " [その他] " . $entry . PHP_EOL; 39 } 40 } 41 42 // close()メソッドで開いたディレクトリハンドルを閉じます。 43 $dirHandle->close(); 44} 45 46// このスクリプトが配置されているディレクトリの内容を一覧表示します。 47// 実際の使用時には、ここに走査したい任意のパスを指定してください。 48listDirectoryContents(__DIR__); 49 50// 例として、一時的なディレクトリを作成して試すこともできます。 51// /* 52// $testDirectory = __DIR__ . '/_test_dir'; 53// if (!is_dir($testDirectory)) { 54// mkdir($testDirectory); 55// file_put_contents($testDirectory . '/test_file.txt', 'Hello, PHP!'); 56// mkdir($testDirectory . '/sub_directory'); 57// } 58// 59// echo PHP_EOL . "--- テストディレクトリの内容 ---" . PHP_EOL; 60// listDirectoryContents($testDirectory); 61// 62// // クリーンアップ (テストディレクトリとその内容を削除) 63// if (is_dir($testDirectory)) { 64// if (file_exists($testDirectory . '/test_file.txt')) { 65// unlink($testDirectory . '/test_file.txt'); 66// } 67// if (is_dir($testDirectory . '/sub_directory')) { 68// rmdir($testDirectory . '/sub_directory'); 69// } 70// rmdir($testDirectory); 71// } 72// */
PHPのdir関数は、指定したディレクトリの内容をプログラムから操作するための機能を提供します。この関数は、string $directory引数に指定されたパスのディレクトリを開き、そのディレクトリを操作するためのDirectoryオブジェクトを返します。もしディレクトリのオープンに失敗した場合は、falseを返しますので、戻り値の確認によるエラーハンドリングが重要です。
返されたDirectoryオブジェクトは、複数のメソッドを持ちます。特に重要なのはread()メソッドで、ディレクトリ内のファイル名やサブディレクトリの名前を一つずつ読み取ることができます。全てのエントリを読み終えるとfalseが返されるため、ループ処理と組み合わせて使用するのが一般的です。また、操作の完了後には、必ずclose()メソッドを呼び出して開いたディレクトリを閉じる必要があります。
サンプルコードでは、まずdir関数で指定されたディレクトリを開き、Directoryオブジェクトが正しく取得できたかを確認しています。次に、whileループ内でread()メソッドを繰り返し呼び出し、ディレクトリ内の各エントリ名を取得しています。取得したエントリがファイルかディレクトリかをis_dir()やis_file()関数で判別し、その種類を表示しています。特に、現在のディレクトリを示す「.」と、親ディレクトリを示す「..」は一般的なエントリですが、これらをスキップする処理も含まれています。最後にclose()でディレクトリを閉じています。
dir関数は、指定されたディレクトリが開けない場合にfalseを返しますので、必ずエラーチェックを行いましょう。また、read()メソッドでディレクトリ内のエントリを読み込む際、現在のディレクトリを示す'.'と親ディレクトリを示す'..'という特殊なエントリも含まれます。これらは通常、表示や処理から除外することが一般的です。ディレクトリ操作が完了したら、close()メソッドを呼び出して、開いたリソースを確実に解放してください。これはシステムのリソースを適切に管理し、不要な負荷を防ぐために非常に重要です。実運用でユーザーが指定するパスを扱う場合は、セキュリティ上のリスク(パス・トラバーサルなど)に十分注意し、適切な検証とサニタイズを常に心がけてください。
PHP dir()でディレクトリ一覧を取得する
1<?php 2 3/** 4 * 指定されたディレクトリの内容を一覧表示します。 5 * 6 * この関数は、OSに依存しないディレクトリ区切り文字である 7 * DIRECTORY_SEPARATOR 定数を使用してパスを構築し、 8 * dir() 関数を使ってディレクトリの内容を読み込みます。 9 * 10 * @return void 11 */ 12function listDirectoryContents(): void 13{ 14 // --- 準備: テスト用のディレクトリとファイルを作成 --- 15 // カレントディレクトリ配下に 'sample_dir' という名前のディレクトリパスを構築します。 16 // DIRECTORY_SEPARATOR を使うことで、Windows (\) でも Linux/macOS (/) でも正しく動作します。 17 $dirName = 'sample_dir'; 18 $path = __DIR__ . DIRECTORY_SEPARATOR . $dirName; 19 20 // ディレクトリとファイルが存在しないことを確認してから作成します。 21 if (!is_dir($path)) { 22 mkdir($path); 23 } 24 file_put_contents($path . DIRECTORY_SEPARATOR . 'file1.txt', 'test1'); 25 file_put_contents($path . DIRECTORY_SEPARATOR . 'file2.log', 'test2'); 26 // ---------------------------------------------------- 27 28 echo "ディレクトリ '{$dirName}' の内容を読み込みます..." . PHP_EOL; 29 30 // dir() 関数でディレクトリハンドルを開きます。 31 // 失敗した場合は false が返るため、処理を中断します。 32 if (($d = dir($path)) === false) { 33 echo "ディレクトリ '{$path}' を開けませんでした。" . PHP_EOL; 34 // 後片付け処理へ 35 } else { 36 // try-finally ブロックで、処理の最後に必ず後片付けが行われるようにします。 37 try { 38 // while ループと read() メソッドで、ディレクトリ内のエントリを1つずつ読み込みます。 39 // 読み込むエントリがなくなると read() は false を返します。 40 while (false !== ($entry = $d->read())) { 41 // '.' (カレントディレクトリ) と '..' (親ディレクトリ) は除外します。 42 if ($entry === '.' || $entry === '..') { 43 continue; 44 } 45 echo $entry . PHP_EOL; 46 } 47 } finally { 48 // 必ずディレクトリハンドルを閉じます。 49 $d->close(); 50 } 51 } 52 53 // --- 後片付け: 作成したファイルとディレクトリを削除 --- 54 unlink($path . DIRECTORY_SEPARATOR . 'file1.txt'); 55 unlink($path . DIRECTORY_SEPARATOR . 'file2.log'); 56 rmdir($path); 57 echo "テスト用のディレクトリとファイルを削除しました。" . PHP_EOL; 58} 59 60// 関数を実行します。 61listDirectoryContents();
PHPのdir()関数は、指定したディレクトリの内容を順次読み込むための機能を提供します。最初の引数$directoryには、読み込みたいディレクトリのパスを文字列で指定します。$contextはオプションの引数で、特定のストリームコンテキストを指定できますが、通常は省略します。関数が成功するとDirectoryクラスのオブジェクトが返され、このオブジェクトを通じてディレクトリ内のファイルやサブディレクトリ名を取得できます。失敗した場合はfalseが返されます。
サンプルコードでは、まずDIRECTORY_SEPARATOR定数を使ってOSに依存しないディレクトリパスを構築し、テスト用のディレクトリとファイルを準備しています。その後、dir()関数で指定パスのディレクトリハンドルを開き、返されたDirectoryオブジェクトのread()メソッドをループで呼び出すことで、ディレクトリ内のエントリ名を一つずつ取得しています。この際、カレントディレクトリを表す.と親ディレクトリを表す..はスキップしています。全ての読み込みが完了したら、close()メソッドで必ずディレクトリハンドルを閉じます。これはfinallyブロックを用いて、処理の途中でエラーが発生しても確実に閉じられるようにしています。最後に、テスト用に作成したディレクトリとファイルを削除し、後片付けを行っています。
PHPのdir()関数を利用する際は、OSに依存しないパスを構築するためDIRECTORY_SEPARATOR定数を使用することが非常に重要です。dir()関数は、指定したディレクトリを開くのに失敗するとfalseを返すため、必ず戻り値をチェックし、適切なエラー処理を行うようにしてください。成功するとDirectoryオブジェクトが返され、read()メソッドでディレクトリ内のエントリを読み込みますが、この際、カレントディレクトリを示す.と親ディレクトリを示す..も含まれるため、必要に応じてこれらを除外する処理を記述しましょう。そして最も大切なのは、処理が終了したらclose()メソッドを呼び出し、必ずディレクトリハンドルを閉じてリソースを解放することです。これを忘れるとリソースリークの原因となるため、try-finallyブロックを活用し、確実に実行するように心がけてください。
PHP dirname関数でパスの親ディレクトリを取得する
1<?php 2 3/** 4 * 指定されたパスからディレクトリ名を取得するdirname()関数の使用例を示します。 5 * システムエンジニアにとって、ファイルパス操作は基本的なスキルです。 6 * この関数は、ファイルの親ディレクトリパスを効率的に取得するのに役立ちます。 7 * 8 * @param string $path ディレクトリ名を取得したいパス。ファイルでもディレクトリでも可。 9 * @return void 10 */ 11function demonstrateDirname(string $path): void 12{ 13 echo "元のパス: " . $path . "\n"; 14 15 // 1. 基本的な使用法: パスの親ディレクトリを取得 16 // 例: '/var/www/html/index.php' -> '/var/www/html' 17 $parentDirectory = dirname($path); 18 echo "親ディレクトリ: " . $parentDirectory . "\n"; 19 20 // 2. 複数レベル上の親ディレクトリを取得 (PHP 7.0.0 以降で利用可能) 21 // 第二引数に取得したいレベル数を指定します。 22 // 例: '/var/www/html/index.php' の2レベル上 -> '/var/www' 23 $grandparentDirectory = dirname($path, 2); 24 echo "2レベル上の親ディレクトリ: " . $grandparentDirectory . "\n"; 25 26 // 3. ディレクトリパスの場合 27 // パスがスラッシュで終わっていても、正しく親ディレクトリを返します。 28 // 例: '/var/www/html/' -> '/var/www' 29 if (str_ends_with($path, '/')) { // PHP 8.0 以降の関数 30 echo "ディレクトリパスの場合 (例: {$path}): " . dirname($path) . "\n"; 31 } 32 33 echo "----------------------------------------\n"; 34} 35 36// サンプルパスで関数を実行 37demonstrateDirname('/usr/local/bin/php/my_script.php'); 38demonstrateDirname('/etc/nginx/nginx.conf'); 39demonstrateDirname('/var/www/html/'); 40demonstrateDirname('C:\\xampp\\htdocs\\index.php'); // Windowsパス形式もサポート 41demonstrateDirname('just_a_file.txt'); // カレントディレクトリを示す'.'を返す 42 43?>
PHPのdirname()関数は、指定されたファイルやディレクトリのパスから、その親ディレクトリのパスを文字列として取得するために使用されます。システムエンジニアにとってファイルパスの操作は基本的なスキルであり、この関数はパスの階層構造を効率的に扱う上で非常に役立ちます。
第一引数$pathには、親ディレクトリ名を取得したい対象のパス(文字列)を指定します。このパスはファイルのものでもディレクトリのものでも構いません。第二引数(PHP 7.0以降で利用可能)には、何レベル上の親ディレクトリを取得したいかを整数で指定でき、デフォルト値は1です。
戻り値は、親ディレクトリのパスを表す文字列です。例えば、/var/www/html/index.phpのようなパスを指定すると、その親ディレクトリである/var/www/htmlが返されます。第二引数に2を指定すれば、2レベル上の親ディレクトリ/var/wwwを取得するといった応用も可能です。パスがスラッシュで終わるディレクトリパスの場合や、Windows形式のパス(例: C:\xampp\htdocs\index.php)も正しく処理します。ファイル名のみが指定された場合(例: just_a_file.txt)は、カレントディレクトリを示す.を返します。このようにdirname()は、プログラム内でファイルパスを解析し、適切なディレクトリパスを導き出す際に非常に有用な関数です。
dirname()関数は、指定パスの親ディレクトリ名を返しますが、利用に際していくつかの注意点があります。パスがスラッシュで終わるディレクトリの場合でも、その1階層上のディレクトリ名を返します。ファイル名のみを渡した場合は、カレントディレクトリを示す「.」が返されるため、この挙動を理解しておくことが重要です。PHP 7.0以降では、第二引数で複数階層上の親ディレクトリを取得できます。この関数はパス文字列を処理するもので、パスが実際に存在するかは確認しません。したがって、ファイルの存在確認が必要な場合は別途行う必要があります。Windows、UNIXどちらのパス形式にも対応しています。
PHPで現在のディレクトリ内容を表示する
1<?php 2 3/** 4 * 現在のスクリプトが存在するディレクトリの内容を表示する関数です。 5 * dir() 関数と dirname(__FILE__) を組み合わせて使用する方法を示します。 6 * 7 * @return void 8 */ 9function listCurrentDirectoryContents(): void 10{ 11 // __FILE__ は現在のスクリプトのフルパス(ファイル名を含む)を返します。 12 // dirname() は、そのパスからディレクトリ部分のみを抽出します。 13 // これにより、現在のスクリプトが置かれているディレクトリの絶対パスが得られます。 14 $targetDirectory = dirname(__FILE__); 15 16 // dir() 関数は、指定されたディレクトリを操作するための Directory オブジェクトを返します。 17 // ディレクトリが開けない場合(例: 存在しない、アクセス権がない)、false を返します。 18 $directoryHandle = dir($targetDirectory); 19 20 if ($directoryHandle === false) { 21 echo "エラー: ディレクトリ '{$targetDirectory}' を開くことができませんでした。\n"; 22 return; 23 } 24 25 echo "ディレクトリ '{$targetDirectory}' の内容:\n"; 26 27 // Directory オブジェクトの read() メソッドは、ディレクトリ内の次のエントリ(ファイルまたはサブディレクトリ)の名前を返します。 28 // 全てのエントリを読み終えると false を返します。 29 while (($entry = $directoryHandle->read()) !== false) { 30 echo "- " . $entry . "\n"; 31 } 32 33 // ディレクトリ操作を終えたら、必ず close() メソッドを呼び出してリソースを解放します。 34 $directoryHandle->close(); 35} 36 37// 関数を実行して、現在のディレクトリの内容を表示します。 38listCurrentDirectoryContents(); 39
PHPのdir()関数は、指定されたディレクトリの内容を読み取るためのDirectoryオブジェクトを返します。これにより、ディレクトリ内のファイルやサブディレクトリを順番に操作できるようになります。
引数$directoryには、操作したいディレクトリのパスを文字列で指定します。サンプルコードでは、__FILE__(現在のスクリプトのフルパス)とdirname()関数を組み合わせて使用し、現在のスクリプトが存在するディレクトリの絶対パスを取得しています。これは、どの環境でも確実に現在のディレクトリを参照するための一般的な方法です。オプションの引数$contextは、より高度な操作でストリームコンテキストを指定するために使用されますが、通常は省略されます。
戻り値は、ディレクトリが正常に開かれた場合はDirectoryクラスのインスタンスとなります。このオブジェクトを通じて、read()メソッドでディレクトリ内の次のエントリ名を取得し、全ての読み込みが完了するとfalseが返されます。しかし、指定されたディレクトリが存在しない場合やアクセス権がない場合はfalseが返されるため、エラーハンドリングが必要です。操作の終了後には、必ずDirectoryオブジェクトのclose()メソッドを呼び出してリソースを解放することが重要です。
このサンプルコードは、dir()関数とdirname(__FILE__)を組み合わせて、現在のスクリプトのディレクトリにあるファイルやフォルダ名を一覧表示する基本的な方法を示しています。
dir()関数は指定されたディレクトリを開き、その操作のためのDirectoryオブジェクトを返しますが、ディレクトリが存在しない場合やアクセス権がない場合はfalseを返します。そのため、必ず戻り値をチェックし、エラーハンドリングを行うことが重要です。また、ディレクトリを開いた後は、処理終了時に必ずclose()メソッドを呼び出してリソースを解放してください。これにより、システムの負荷軽減と安定稼働に繋がります。dirname(__FILE__)は、実行中のスクリプトファイルが存在するディレクトリのパスを確実に取得するPHPの基本的なイディオムです。Directoryオブジェクトのread()メソッドは、.(カレントディレクトリ)や..(親ディレクトリ)といった特殊なエントリも列挙するため、実際のファイルやディレクトリのみを扱いたい場合は条件分岐で除外するなどの工夫が必要です。