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

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

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

作成日: 更新日:

基本的な使い方

getSizeメソッドは、DirectoryIteratorオブジェクトが現在指しているファイルまたはディレクトリのサイズをバイト単位で取得するメソッドです。DirectoryIteratorクラスは、ファイルシステム内のディレクトリを反復処理し、その中のファイルやサブディレクトリの情報を取得する際に使用されます。このgetSizeメソッドは、反復処理中の個々の要素に対して、そのサイズ情報を得るために利用されます。

具体的には、ファイルに対してこのメソッドを呼び出すと、そのファイルの正確なバイト数を整数値(int型)で返します。例えば、1024バイトのファイルであれば1024という値が戻り値として得られます。

一方、ディレクトリに対してこのメソッドを呼び出した場合、多くのファイルシステムではディレクトリ自体のメタデータ(エントリ情報など)のサイズが返されるため、通常は0バイトまたは非常に小さな値が返される点にご注意ください。これは、ディレクトリ内の全ファイルの合計サイズを計算して返すものではなく、ディレクトリそのもののディスク上のサイズを示すためです。

もし何らかの理由でファイルまたはディレクトリのサイズを取得できなかった場合、このメソッドは0を返します。この挙動により、サイズの取得に失敗した場合でも、プログラムが予期せぬエラーを起こすことなく処理を継続できるようになっています。

このメソッドは、ファイルのサイズに基づいて特定の処理を適用したい場合や、ファイルサイズの一覧を作成したい場合など、ファイルシステム操作における様々な場面で活用されます。

構文(syntax)

1<?php
2$iterator = new DirectoryIterator('.');
3
4foreach ($iterator as $fileinfo) {
5    if ($fileinfo->isFile()) {
6        echo $fileinfo->getSize();
7        break;
8    }
9}

引数(parameters)

引数なし

引数はありません

戻り値(return)

int|false

DirectoryIterator::getSizeメソッドは、現在のエントリ(ファイルまたはディレクトリ)のサイズをバイト単位で返します。ファイルでない場合や、サイズを取得できない場合はfalseを返します。

サンプルコード

PHP DirectoryIterator::getSize() でファイルサイズを取得する

1<?php
2
3/**
4 * 指定されたディレクトリ内のファイルのサイズを取得し表示するサンプル。
5 *
6 * この関数は一時的なディレクトリとファイルを作成し、
7 * DirectoryIterator を使用してファイルのサイズを取得する方法を示します。
8 * 処理後、作成した一時ファイルとディレクトリは削除されます。
9 */
10function demonstrateDirectoryIteratorGetSize(): void
11{
12    // 1. 一時ディレクトリを作成し、テスト用のファイルを準備する
13    $tempDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'php_getsize_example_' . uniqid();
14    if (!mkdir($tempDir) && !is_dir($tempDir)) {
15        echo "エラー: 一時ディレクトリ '{$tempDir}' の作成に失敗しました。" . PHP_EOL;
16        return;
17    }
18
19    $testFilePaths = [];
20    $fileContents = [
21        'sample_file_1.txt' => 'これはテストファイル1の内容です。', // 46バイト (UTF-8)
22        'sample_file_2.log' => '二つ目のテストファイルで、少し長めの内容です。' . PHP_EOL . '複数行にわたる場合も考慮します。', // 94バイト (UTF-8)
23        'empty_file.dat'    => '', // 0バイト
24    ];
25
26    foreach ($fileContents as $fileName => $content) {
27        $filePath = $tempDir . DIRECTORY_SEPARATOR . $fileName;
28        if (file_put_contents($filePath, $content) === false) {
29            echo "エラー: ファイル '{$filePath}' の作成に失敗しました。" . PHP_EOL;
30            // ファイル作成に失敗したら、後続の処理を行わずにクリーンアップして終了
31            cleanupTempDir($tempDir, $testFilePaths);
32            return;
33        }
34        $testFilePaths[] = $filePath;
35    }
36
37    echo "--- DirectoryIterator::getSize() の使用例 ---" . PHP_EOL;
38    echo "対象ディレクトリ: " . $tempDir . PHP_EOL;
39
40    try {
41        // 2. DirectoryIterator のインスタンスを作成
42        // 指定されたディレクトリのエントリを反復処理するために使用します。
43        $iterator = new DirectoryIterator($tempDir);
44
45        // 3. ディレクトリ内の各エントリを反復処理し、ファイルサイズを取得する
46        foreach ($iterator as $fileInfo) {
47            // "." や ".." (カレントディレクトリと親ディレクトリ) はスキップします。
48            // また、ファイルのみを対象とします。
49            if ($fileInfo->isFile()) {
50                $fileName = $fileInfo->getFilename();
51                $fileSize = $fileInfo->getSize(); // ファイルサイズをバイト単位で取得
52
53                // getSize() は成功すると int、失敗すると false を返します。
54                if ($fileSize !== false) {
55                    echo "ファイル名: '{$fileName}', サイズ: {$fileSize} バイト" . PHP_EOL;
56                } else {
57                    echo "ファイル名: '{$fileName}', サイズの取得に失敗しました。" . PHP_EOL;
58                }
59            }
60            // DirectoryIterator はディレクトリもエントリとして返しますが、
61            // getSize() はファイルに対して使用するのが一般的です。
62            // ディレクトリに対してgetSize()を呼び出すと0を返します。
63        }
64    } catch (UnexpectedValueException $e) {
65        // ディレクトリが存在しない、またはアクセス権がない場合のエラーハンドリング
66        echo "エラー: ディレクトリの読み込み中に問題が発生しました - " . $e->getMessage() . PHP_EOL;
67    } finally {
68        // 4. 最後に作成した一時ファイルとディレクトリをクリーンアップ
69        cleanupTempDir($tempDir, $testFilePaths);
70    }
71
72    echo "--- 処理完了 ---" . PHP_EOL;
73}
74
75/**
76 * 一時ディレクトリとその中のファイルをクリーンアップするヘルパー関数。
77 *
78 * @param string $dirPath クリーンアップするディレクトリのパス。
79 * @param array $filePaths ディレクトリ内に作成されたファイルのパスの配列。
80 */
81function cleanupTempDir(string $dirPath, array $filePaths): void
82{
83    foreach ($filePaths as $filePath) {
84        if (file_exists($filePath)) {
85            unlink($filePath); // ファイルを削除
86        }
87    }
88    if (is_dir($dirPath)) {
89        rmdir($dirPath); // ディレクトリを削除
90    }
91}
92
93// 関数を実行して、DirectoryIterator::getSize() の動作を確認します。
94demonstrateDirectoryIteratorGetSize();

このサンプルコードは、PHPのDirectoryIteratorクラスとそのgetSize()メソッドを使用し、指定されたディレクトリ内のファイルのサイズを取得する方法を具体的に示しています。DirectoryIteratorは、ディレクトリ内のファイルやサブディレクトリといった各要素(エントリ)を順番に処理するために利用されます。

getSize()メソッドは、現在処理しているファイルのエントリが持つサイズをバイト単位で取得する役割を持っています。このメソッドは引数を必要としません。戻り値は、ファイルのサイズが正常に取得できた場合は整数(int)でそのサイズを返し、取得に失敗した場合はfalseを返します。そのため、コード内ではgetSize()の呼び出し後に戻り値がfalseでないかを確認し、エラーハンドリングを行っています。

サンプルコードの実行では、まず一時ディレクトリを作成し、複数の異なるサイズのテストファイルを準備します。次に、DirectoryIteratorのインスタンスを作成して一時ディレクトリ内の各エントリを反復処理し、ファイルである場合にgetSize()メソッドを使ってファイルサイズを表示します。処理の完了後には、作成した一時ファイルとディレクトリを安全に削除(クリーンアップ)しています。この一連の処理を通じて、PHPでディレクトリ内のファイル情報を効率的に取得し扱うための基本的な流れを学ぶことができます。

DirectoryIterator::getSize() はファイルのサイズをバイト単位で整数値として返しますが、何らかの原因でサイズ取得に失敗した場合は false を返します。そのため、必ず戻り値が false でないかを確認する処理を組み込み、適切にエラーハンドリングしてください。このメソッドはファイルに適用するのが一般的で、ディレクトリに対して呼び出すと多くの場合で 0 を返しますのでご注意ください。また、DirectoryIterator でディレクトリ内のエントリを反復処理する際には、.(カレントディレクトリ)や ..(親ディレクトリ)といった特殊なエントリを除外するため、isFile() メソッドなどを用いてファイルのみを対象とすることが重要です。

関連コンテンツ