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

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

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

作成日: 更新日:

基本的な使い方

getSizeメソッドは、FilesystemIteratorクラスにおいて、現在イテレータが指し示しているファイル要素のサイズをバイト単位で取得するために実行するメソッドです。FilesystemIteratorは、ファイルシステム内の特定のディレクトリを効率的に反復処理(一つずつ要素を調べていくこと)するためのPHPの組み込み機能です。このメソッドは、ディレクトリ内の各ファイルについて、その内容の物理的な大きさを数値として提供します。

具体的には、イテレータが現在処理している要素がファイルである場合に、そのファイルのデータ容量を整数値で返します。例えば、1024バイトのファイルであれば1024を返します。しかし、現在の要素がディレクトリである場合、ディレクトリ自体には内容としてのサイズがないため、このメソッドは常に0を返します。

このgetSizeメソッドを適切に利用するには、FilesystemIteratorのインスタンスを生成する際に、ファイル情報として現在の要素を取得するように設定する必要があります。具体的には、FilesystemIteratorのコンストラクタの第二引数にFilesystemIterator::CURRENT_AS_FILEINFOというフラグを指定することで、イテレータが各要素をSplFileInfoオブジェクトとして扱い、getSizeメソッドが機能するようになります。これにより、システムエンジニアは、ディレクトリ内のファイルサイズに基づいて特定の処理を実行したり、ファイルサイズの合計を計算したりするアプリケーションを簡単に構築できるようになります。

構文(syntax)

1<?php
2$iterator = new FilesystemIterator(__DIR__);
3foreach ($iterator as $fileInfo) {
4    if ($fileInfo->isFile()) {
5        $fileSize = $fileInfo->getSize();
6    }
7}
8?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

このメソッドは、現在のファイルまたはディレクトリのサイズをバイト単位で表す整数値を返します。

サンプルコード

PHP FilesystemIterator getSizeでファイルサイズを取得する

1<?php
2
3/**
4 * FilesystemIterator::getSize() メソッドを使用してファイルのサイズを取得するサンプル関数です。
5 * システムエンジニアを目指す初心者向けに、一時ファイルの作成からサイズ取得、削除までを一貫して示します。
6 */
7function displayFileSizeUsingFilesystemIterator(): void
8{
9    // 1. テスト用の一時ファイルを作成するディレクトリを準備します。
10    // スクリプトと同じディレクトリに 'temp_files' というディレクトリを作成します。
11    $tempDir = __DIR__ . DIRECTORY_SEPARATOR . 'temp_files';
12    if (!is_dir($tempDir)) {
13        mkdir($tempDir, 0777, true); // ディレクトリが存在しない場合は作成します
14    }
15
16    // 2. テスト用の一時ファイルを作成します。
17    // ファイル名と内容を指定し、ファイルに書き込みます。
18    // このファイルのサイズを後で取得します。
19    $tempFileName = 'sample_file_for_size_check.txt';
20    $tempFilePath = $tempDir . DIRECTORY_SEPARATOR . $tempFileName;
21    $fileContent = 'This is a sample file content for checking its size with FilesystemIterator::getSize().'; // 87バイト
22    file_put_contents($tempFilePath, $fileContent);
23
24    echo "一時ファイルを作成しました: {$tempFilePath}\n";
25
26    try {
27        // 3. FilesystemIterator を使用してディレクトリをイテレートします。
28        // FilesystemIterator::CURRENT_AS_FILEINFO フラグは、
29        // current() メソッドが SplFileInfo オブジェクトを返すようにします。
30        // これは getSize() が返す情報と関連しますが、必須ではありません。
31        $iterator = new FilesystemIterator($tempDir, FilesystemIterator::CURRENT_AS_FILEINFO);
32
33        $fileFound = false;
34        foreach ($iterator as $fileInfo) {
35            // 現在の要素がディレクトリではなくファイルであり、かつ目的のファイル名であるかを確認します。
36            if ($fileInfo->isFile() && $fileInfo->getFilename() === $tempFileName) {
37                // FilesystemIterator::getSize() は、現在の要素(この場合はファイル)のサイズを
38                // バイト単位で返します。
39                $fileSize = $iterator->getSize();
40                echo "ファイル名: {$fileInfo->getFilename()}\n";
41                echo "ファイルサイズ (FilesystemIterator::getSize()): {$fileSize} バイト\n";
42                $fileFound = true;
43                break; // 目的のファイルが見つかったらループを終了します
44            }
45        }
46
47        if (!$fileFound) {
48            echo "指定されたファイル ({$tempFileName}) がディレクトリ内で見つかりませんでした。\n";
49        }
50
51    } catch (UnexpectedValueException $e) {
52        // 指定されたパスが有効なディレクトリでない場合などに発生するエラーを処理します。
53        echo "エラー: ディレクトリの読み込みに失敗しました - " . $e->getMessage() . "\n";
54    } finally {
55        // 4. 作成した一時ファイルとディレクトリをクリーンアップします。
56        // エラーが発生した場合でも確実に削除されるように finally ブロックを使用します。
57        if (file_exists($tempFilePath)) {
58            unlink($tempFilePath); // 一時ファイルを削除します
59            echo "一時ファイルを削除しました: {$tempFilePath}\n";
60        }
61        if (is_dir($tempDir)) {
62            rmdir($tempDir); // 一時ディレクトリを削除します(空の場合のみ)
63            echo "一時ディレクトリを削除しました: {$tempDir}\n";
64        }
65    }
66}
67
68// 関数を実行して、ファイルサイズの取得処理を開始します。
69displayFileSizeUsingFilesystemIterator();

このサンプルコードは、PHPのFilesystemIteratorクラスが提供するgetSize()メソッドを使って、ファイルのサイズを取得する方法をシステムエンジニアを目指す初心者向けに紹介しています。getSize()メソッドは、FilesystemIteratorが現在指し示しているファイルやディレクトリのサイズを整数値(バイト単位)で返す機能を持っています。このメソッドは引数を必要としません。

コードではまず、getSize()メソッドの動作を確認するために、一時的なディレクトリとファイルを作成し、そのファイルにテスト用の内容を書き込みます。これにより、サイズ計測の対象となるファイルが準備されます。

次に、作成した一時ファイルが含まれるディレクトリに対してFilesystemIteratorを初期化し、ディレクトリ内の各要素を順番に処理します。ループ内で目的のファイルが見つかった際、$iterator->getSize()を呼び出すことで、イテレータが現在指しているファイルのサイズをバイト単位で取得し、その結果を表示しています。この方法により、ディレクトリを効率的に走査しながら、必要なファイルのサイズ情報を取得できることがわかります。

最後に、テスト目的で作成した一時ファイルとディレクトリは、処理が完了した後、またはエラーが発生した場合でも確実に削除されるように配慮されています。これは、リソースを適切に管理する上での良い実践例でもあります。

FilesystemIterator::getSize()は、FilesystemIteratorオブジェクトが現在指しているファイル要素のサイズをバイト単位で返します。このメソッドは、ディレクトリ内のファイルを順次処理し、それぞれのサイズを取得する用途に適しています。特定のファイルサイズのみを知りたい場合は、filesize()関数を使う方が一般的で簡潔です。イテレータがファイル以外の要素を指している場合やファイルが見つからない場合の結果には注意しましょう。サンプルコードのように一時ファイルやディレクトリを作成する際は、処理の完了やエラー発生時にも確実に削除できるよう、finallyブロックでクリーンアップを行うことが重要です。

関連コンテンツ