【PHP8.x】RecursiveDirectoryIterator::getSize()メソッドの使い方
getSizeメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getSizeメソッドは、RecursiveDirectoryIteratorクラスを通して、ファイルシステム上の特定の要素のサイズ情報を取得するために使用されるメソッドです。RecursiveDirectoryIteratorクラスは、指定したディレクトリとそのサブディレクトリ(階層下のディレクトリ)を順番にたどって、その中にあるファイルやディレクトリ一つひとつにアクセスできるようにするクラスです。このクラスは、ファイルシステムを再帰的に走査し、各要素にアクセスする機能を提供します。
getSizeメソッドは、この走査の過程で現在アクセスしている要素がファイルである場合に、そのファイルの大きさをバイト単位の整数値で返します。例えば、1024バイトのファイルであれば「1024」という数値が返されます。この機能は、ファイルの内容がどれくらいの容量を占めているかを知りたい場合に特に役立ちます。
もし現在アクセスしている要素がディレクトリであった場合、getSizeメソッドは「0」を返します。これは、このメソッドが個々のファイルのデータ量に焦点を当てており、ディレクトリ自体の容量を測定するものではないためです。
このメソッドを利用することで、ディレクトリ内のすべてのファイルの合計サイズを計算したり、特定のサイズを超えるファイルを検出したりするなど、ファイルシステムを効率的に管理するための様々な処理を実現できます。システムエンジニアを目指す方にとって、ファイルシステムの操作は基本的なスキルのため、このメソッドの理解は重要です。
構文(syntax)
1<?php 2$directoryPath = __DIR__; // 現在のスクリプトが存在するディレクトリのパス 3$iterator = new RecursiveDirectoryIterator($directoryPath); 4 5foreach ($iterator as $fileInfo) { 6 if ($fileInfo->isFile()) { 7 $fileSize = $fileInfo->getSize(); // SplFileInfo オブジェクトの getSize() メソッドを呼び出し、ファイルのサイズをバイト単位で取得 8 // $fileSize にはファイルサイズが格納されます 9 break; // 最初のファイルが見つかった時点で処理を停止(構文を示すため) 10 } 11} 12?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
RecursiveDirectoryIterator::getSize メソッドは、現在のファイルまたはディレクトリのサイズをバイト単位の整数で返します。
サンプルコード
PHP RecursiveDirectoryIterator::getSize() でファイルサイズを取得する
1<?php 2 3/** 4 * 指定されたディレクトリ内のトップレベルファイルのサイズを表示します。 5 * RecursiveDirectoryIterator::getSize() メソッドの使用例を示します。 6 * 7 * @param string $directoryPath 走査するディレクトリのパス 8 */ 9function displayFileSizesInDirectory(string $directoryPath): void 10{ 11 // サンプルコードが単体で動作するように、一時的なディレクトリとファイルを作成します。 12 // 実際には、既存のディレクトリパスを指定して使用します。 13 if (!is_dir($directoryPath)) { 14 if (!mkdir($directoryPath, 0777, true)) { 15 echo "エラー: ディレクトリ '{$directoryPath}' を作成できませんでした。\n"; 16 return; 17 } 18 } 19 20 // デモンストレーション用のファイルを作成 21 $tempFile1 = $directoryPath . '/sample_document.txt'; 22 $tempFile2 = $directoryPath . '/data_log.csv'; 23 $tempSubDir = $directoryPath . '/nested_folder'; 24 25 file_put_contents($tempFile1, 'これはテストファイルの内容です。'); // 30 バイト (UTF-8) 26 file_put_contents($tempFile2, str_repeat('A', 100)); // 100 バイト 27 mkdir($tempSubDir, 0777); // サブディレクトリは getSize() では通常0バイトと表示されるか、 28 // この例ではファイルとして扱われないため出力されません。 29 30 echo "ディレクトリ '{$directoryPath}' 内のトップレベルファイルのサイズ:\n"; 31 32 try { 33 // RecursiveDirectoryIterator のインスタンスを作成します。 34 // FilesystemIterator::SKIP_DOTS フラグは '.' と '..' エントリをスキップします。 35 $iterator = new RecursiveDirectoryIterator( 36 $directoryPath, 37 FilesystemIterator::SKIP_DOTS 38 ); 39 40 // イテレータをループして各エントリにアクセスします。 41 // ここでの $item は RecursiveDirectoryIterator のインスタンスです。 42 // このクラスは SplFileInfo のメソッドも持ちます。 43 foreach ($iterator as $item) { 44 // 現在のエントリがファイルであるかを確認します。 45 if ($item->isFile()) { 46 $fileName = $item->getFilename(); 47 // getSize() メソッドを使用してファイルのサイズをバイト単位で取得します。 48 $fileSize = $item->getSize(); // 戻り値は int 型 49 echo sprintf("- %s: %d バイト\n", $fileName, $fileSize); 50 } 51 } 52 } catch (UnexpectedValueException $e) { 53 echo "エラー: ディレクトリ '{$directoryPath}' を開けませんでした。メッセージ: " . $e->getMessage() . "\n"; 54 } finally { 55 // デモ用に作成したファイルとディレクトリをクリーンアップします。 56 if (file_exists($tempFile1)) { 57 unlink($tempFile1); 58 } 59 if (file_exists($tempFile2)) { 60 unlink($tempFile2); 61 } 62 if (is_dir($tempSubDir)) { 63 rmdir($tempSubDir); 64 } 65 // ディレクトリが空の場合のみ削除します。 66 if (is_dir($directoryPath) && count(scandir($directoryPath)) <= 2) { 67 rmdir($directoryPath); 68 } 69 } 70} 71 72// サンプルコードを実行するための、一時的なディレクトリパスを定義します。 73$demoDirectory = __DIR__ . DIRECTORY_SEPARATOR . 'php_getsize_example_dir'; 74displayFileSizesInDirectory($demoDirectory);
PHPのRecursiveDirectoryIterator::getSize()メソッドは、ディレクトリ内のファイルサイズを取得するために使用されます。このメソッドは、RecursiveDirectoryIteratorクラスのインスタンスがファイルを表す際に利用できる機能で、指定されたディレクトリとその中のサブディレクトリを効率的に探索し、見つかった個々のファイルのサイズを把握したい場合に特に役立ちます。
getSize()メソッドは引数を必要とせず、呼び出すと対象のファイルのサイズをバイト単位の整数値(int型)として返します。たとえば、サンプルコードでは、RecursiveDirectoryIteratorを使ってディレクトリ内の各エントリを順に処理し、isFile()メソッドでそれがファイルであることを確認した後に、getSize()を呼び出してそのファイルの具体的なサイズを取得しています。これにより、ディレクトリ内の各ファイルの容量を正確に確認でき、ログファイルのサイズ監視やストレージ使用量の集計など、さまざまなシステム管理タスクに応用することができます。
getSize()メソッドは、ディレクトリではなくファイルのサイズをバイト単位でint型で返します。そのため、サンプルコードのようにisFile()メソッドで対象がファイルであることを確認してから利用してください。このサンプルはデモ用として一時的なファイルとディレクトリを作成・削除していますが、実際のシステムでは既存のディレクトリパスを指定し、不要なファイル作成や削除は避けてください。RecursiveDirectoryIteratorは、指定されたディレクトリ内の要素を順に処理しますが、サブディレクトリを再帰的に探索したい場合は、通常RecursiveIteratorIteratorと組み合わせて使用します。また、ディレクトリが存在しない場合やアクセス権がない場合にはUnexpectedValueExceptionが発生しますので、安全な利用のために例外処理を適切に行ってください。