【PHP8.x】is_dir関数の使い方
is_dir関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
is_dir関数は、指定されたパスが既存のディレクトリであるかどうかを判断するPHPの組み込み関数です。この関数は、引数として検査したいパスの文字列を一つ受け取ります。もしそのパスが実際に存在するディレクトリを指していればtrue(真)を返し、そうでなければfalse(偽)を返します。
例えば、あるファイルシステム上で特定のフォルダが存在するかどうかを確認したい場合に非常に役立ちます。falseが返されるケースには、指定されたパスが存在しない場合、パスがディレクトリではなくファイルである場合、あるいはPHPがそのパスにアクセスする権限を持っていない場合などが含まれます。
ファイルやディレクトリの操作を行う前に、対象が意図した種類のパスであるかを確認することで、予期せぬエラーを防ぎ、堅牢なプログラムを作成することができます。特に、ユーザーからの入力パスを扱う際には、セキュリティと安定性の観点から、この関数を用いてパスの検証を行うことが推奨されます。この関数はファイルシステム操作の基本的な機能の一つとして、多くのPHPアプリケーションで利用されています。
構文(syntax)
1<?php 2$path = __DIR__; // このスクリプトが存在するディレクトリのパス 3$isItADirectory = is_dir($path); 4var_dump($isItADirectory); 5?>
引数(parameters)
string $filename
- string $filename: 存在を確認したいディレクトリのパスを指定する文字列
戻り値(return)
bool
指定されたパスがディレクトリであれば true を、そうでなければ false を返します。
サンプルコード
PHP: is_dir()でディレクトリか判定する
1<?php 2 3/** 4 * 指定されたパスがディレクトリであるかを確認するサンプル関数。 5 * is_dir()関数の基本的な使い方と挙動を示します。 6 */ 7function checkDirectoryExamples(): void 8{ 9 // 現在のスクリプトがあるディレクトリ内に一時ディレクトリを作成 10 $tempDirPath = __DIR__ . '/test_directory'; 11 // 存在しないパスの例 12 $nonExistentPath = __DIR__ . '/non_existent_path'; 13 // 現在のスクリプトファイルのパス (これはディレクトリではない) 14 $filePath = __FILE__; 15 16 // テスト用にディレクトリが存在しない場合は作成 17 if (!is_dir($tempDirPath)) { 18 mkdir($tempDirPath); 19 echo "情報: テスト用のディレクトリ '{$tempDirPath}' を作成しました。" . PHP_EOL; 20 } 21 22 echo "--- is_dir() 関数の使用例 ---" . PHP_EOL; 23 24 // 1. 存在するディレクトリのパスをチェック 25 echo "パス: '{$tempDirPath}'" . PHP_EOL; 26 if (is_dir($tempDirPath)) { 27 echo " 結果: ディレクトリです。" . PHP_EOL; 28 } else { 29 echo " 結果: ディレクトリではありません。" . PHP_EOL; 30 } 31 echo PHP_EOL; 32 33 // 2. 存在しないパスをチェック 34 echo "パス: '{$nonExistentPath}'" . PHP_EOL; 35 if (is_dir($nonExistentPath)) { 36 echo " 結果: ディレクトリです。" . PHP_EOL; 37 } else { 38 echo " 結果: ディレクトリではありません。" . PHP_EOL; 39 } 40 echo PHP_EOL; 41 42 // 3. ファイルのパスをチェック (is_dir()はファイルに対してはfalseを返す) 43 echo "パス: '{$filePath}'" . PHP_EOL; 44 if (is_dir($filePath)) { 45 echo " 結果: ディレクトリです。" . PHP_EOL; 46 } else { 47 echo " 結果: ディレクトリではありません。" . PHP_EOL; 48 } 49 echo PHP_EOL; 50 51 // テスト用に作成したディレクトリを削除 (後処理) 52 if (is_dir($tempDirPath)) { 53 rmdir($tempDirPath); 54 echo "情報: テスト用のディレクトリ '{$tempDirPath}' を削除しました。" . PHP_EOL; 55 } 56} 57 58// サンプル関数を実行 59checkDirectoryExamples(); 60 61?>
PHPのis_dir関数は、指定されたパスが既存のディレクトリであるかどうかを判定するために使用されます。この関数は、引数として確認したいパスを文字列で受け取ります。例えば、/path/to/my_directoryのようなファイルシステムのパスを指定します。
戻り値は真偽値(bool型)で、指定されたパスが実際に存在するディレクトリであればtrueを返し、そうでない場合(例えば、ファイルである場合や、パス自体が存在しない場合など)はfalseを返します。
サンプルコードでは、is_dir関数の具体的な挙動が示されています。まず、一時的なディレクトリを作成し、その存在するディレクトリに対してis_dirを適用すると、「ディレクトリです」と表示され、trueが返されることがわかります。次に、存在しないパスや、ファイルであるパスに対してis_dirを適用した場合は、「ディレクトリではありません」と表示され、falseが返されることを確認できます。これにより、ファイルシステム上でのパスの種類を確実に判別し、安全にファイル操作を進めるための条件分岐に活用できます。
is_dir()関数は、指定したパスがディレクトリの場合にtrueを返します。注意点として、パスが存在しない場合や、ファイルである場合も同様にfalseを返すため、これらを区別できません。パスの存在自体を確認したい場合は、file_exists()関数を先に使うのが確実です。また、Webサーバーなどの環境では、PHPを実行するユーザーにディレクトリへのアクセス権限(パーミッション)がないと、ディレクトリが実際に存在していてもfalseが返ることがあります。PHPはパフォーマンス向上のためファイルの状態をキャッシュするので、ループ処理などで状態が変わりうる場合はclearstatcache()関数でキャッシュをクリアする必要があることにも留意してください。
PHPでディレクトリが空か判定する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 指定されたパスが空のディレクトリであるかどうかを判定します。 7 * 8 * is_dir() を使用して、まずパスが有効なディレクトリであることを確認します。 9 * その後、ディレクトリ内に '.' と '..' 以外のファイルやサブディレクトリが 10 * 存在しないことを効率的にチェックします。 11 * 12 * @param string $path チェックするディレクトリのパス。 13 * @return bool ディレクトリが存在し、かつ空である場合は true、そうでない場合は false を返します。 14 */ 15function isDirectoryEmpty(string $path): bool 16{ 17 // is_dir() で、指定されたパスがディレクトリでない、または存在しない場合、処理を中断 18 if (!is_dir($path)) { 19 return false; 20 } 21 22 // FilesystemIterator を使ってディレクトリをスキャンする準備をします。 23 // FilesystemIterator::SKIP_DOTS を指定すると、'.' と '..' を自動的に無視できます。 24 $iterator = new FilesystemIterator($path, FilesystemIterator::SKIP_DOTS); 25 26 // valid() は、イテレータが有効な項目(ファイルやサブディレクトリ)を指しているかを返します。 27 // 最初の時点で valid() が false を返す場合、ディレクトリには中身がないことを意味します。 28 return !$iterator->valid(); 29} 30 31// --- 以下、サンプルコードの動作確認 --- 32 33// 1. テスト用のディレクトリとファイルを準備 34$emptyDir = __DIR__ . '/test_dir_empty'; 35$notEmptyDir = __DIR__ . '/test_dir_not_empty'; 36$fileInDir = $notEmptyDir . '/dummy.txt'; 37$notADirectory = __DIR__ . '/not_a_directory.txt'; 38 39// 事前にクリーンアップ 40if (file_exists($fileInDir)) unlink($fileInDir); 41if (is_dir($notEmptyDir)) rmdir($notEmptyDir); 42if (is_dir($emptyDir)) rmdir($emptyDir); 43if (file_exists($notADirectory)) unlink($notADirectory); 44 45// テスト用のディレクトリとファイルを作成 46mkdir($emptyDir); 47mkdir($notEmptyDir); 48file_put_contents($fileInDir, 'test content'); 49file_put_contents($notADirectory, 'test content'); 50 51 52// 2. 関数を実行して結果を確認 53echo "--- ディレクトリが空かどうかの判定結果 ---" . PHP_EOL; 54 55echo "判定対象: '{$emptyDir}' (空のディレクトリ)" . PHP_EOL; 56var_dump(isDirectoryEmpty($emptyDir)); // 期待値: bool(true) 57 58echo PHP_EOL; 59 60echo "判定対象: '{$notEmptyDir}' (空ではないディレクトリ)" . PHP_EOL; 61var_dump(isDirectoryEmpty($notEmptyDir)); // 期待値: bool(false) 62 63echo PHP_EOL; 64 65echo "判定対象: 'non_existent_dir' (存在しないディレクトリ)" . PHP_EOL; 66var_dump(isDirectoryEmpty('non_existent_dir')); // 期待値: bool(false) 67 68echo PHP_EOL; 69 70echo "判定対象: '{$notADirectory}' (ファイル)" . PHP_EOL; 71var_dump(isDirectoryEmpty($notADirectory)); // 期待値: bool(false) 72 73 74// 3. 後片付け 75unlink($fileInDir); 76rmdir($notEmptyDir); 77rmdir($emptyDir); 78unlink($notADirectory); 79
このサンプルコードは、PHPのis_dir関数を利用して、指定されたパスが空のディレクトリであるかを判定するisDirectoryEmpty関数を定義しています。PHP 8のis_dir関数は、引数に指定された$filenameパスが実際にディレクトリであるかを調べ、その結果をtrueまたはfalseのブール値で返します。
isDirectoryEmpty関数は、まずis_dir()を使って、引数で与えられた$pathが有効なディレクトリであるかを確認します。これにより、ディレクトリではないファイルや存在しないパスに対して誤った判定がされることを防ぎます。パスがディレクトリであることを確認した後、FilesystemIteratorという機能を使ってディレクトリ内部をスキャンします。この際、FilesystemIterator::SKIP_DOTSという設定を加えることで、現在のディレクトリを示す「.」や親ディレクトリを示す「..」といった特殊な項目を自動的に無視し、実際のファイルやサブディレクトリのみを対象とします。最終的に、スキャンした結果「.」や「..」以外の有効な項目が一つも存在しない場合に、そのディレクトリは空であると判断しtrueを返します。
isDirectoryEmpty関数の引数$pathには確認したいディレクトリのパスを文字列で渡し、戻り値は、ディレクトリが存在し、かつ空であればtrue、それ以外の場合はfalseを返します。
is_dir()は、引数のパスが存在し、かつディレクトリであるかを厳密に判定します。ファイルや存在しないパスではfalseを返すため、対象がディレクトリであることを確認する際に利用します。ディレクトリが空かを確認する際は、.と..といった特殊なエントリをFilesystemIterator::SKIP_DOTSオプションで効率的に無視できることを理解しましょう。実際のシステムでは、指定パスへの読み取り権限不足によりエラーが発生する可能性があります。そのため、ファイルシステム権限とパスの正確性を常に確認し、堅牢なエラーハンドリングを検討することが重要です。