【PHP8.x】filesize関数の使い方
filesize関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
filesize関数は、指定されたファイルのサイズをバイト単位で取得する関数です。この関数は、引数としてファイル名を表す文字列を一つ受け取ります。ファイル名には、対象ファイルの相対パスまたは絶対パスを指定できます。
関数が正常に実行された場合、ファイルのサイズが整数値として返されます。この値は、ファイルのデータを構成する最小単位であるバイトの総数を示しています。例えば、1024バイトは1キロバイトに相当します。
しかし、いくつかの状況で関数は失敗し、falseを返すことがあります。これには、指定されたファイルが存在しない場合、PHPがファイルへの読み取り権限を持っていない場合、またはファイルではなくディレクトリのパスを指定した場合などが含まれます。これらのエラーが発生した場合、PHPは警告メッセージも出力しますので、関数がfalseを返した際には、適切なエラー処理を行うことが重要です。
filesize関数は、ローカルファイルシステム上のファイルにのみ適用される点に注意してください。例えば、HTTPやFTPなどのストリームラッパーを介したリモートファイルのサイズを取得しようとしても、期待通りに動作しないことがあります。また、ファイルサイズがPHPの整数型の最大値を超えるような非常に大きなファイルの場合、特に32ビットシステムでは正確な値が取得できない可能性があるため、この点も考慮に入れる必要があります。この関数は、ファイルのアップロード制限のチェックや、ディスク使用量の計算、ファイル処理の事前確認など、ファイルの基本的な情報を取得する上で広く活用されます。
構文(syntax)
1<?php 2$fileSize = filesize('path/to/your/file.txt'); 3?>
引数(parameters)
string $filename
- string $filename: サイズを取得したいファイルの名前を指定する文字列
戻り値(return)
int|false
指定されたファイルサイズをバイト単位の整数で返します。ファイルが存在しない、あるいはアクセスできない場合は false を返します。
サンプルコード
PHP filesizeでファイルサイズを単位付きで表示する
1<?php 2 3/** 4 * 指定されたファイルのサイズを人間が読める形式で返します。 5 * (例: 100 B, 1.5 KB, 2.3 MB) 6 * 7 * @param string $filePath ファイルのパス 8 * @return string ファイルサイズを単位付きで表現した文字列、またはエラーメッセージ 9 */ 10function getHumanReadableFileSize(string $filePath): string 11{ 12 // filesize() 関数でファイルのサイズをバイト単位で取得します。 13 // ファイルが存在しない、またはアクセスできない場合は false を返します。 14 $bytes = filesize($filePath); 15 16 // filesize() が失敗した場合の処理 17 if ($bytes === false) { 18 return "ファイルが見つからないか、読み取ることができません。"; 19 } 20 21 // サイズが0バイトの場合は、0 B とします。 22 if ($bytes === 0) { 23 return "0 B"; 24 } 25 26 // サイズの単位を定義します。 27 $units = ['B', 'KB', 'MB', 'GB', 'TB']; 28 $i = 0; 29 30 // サイズが1024バイト以上の場合、単位を一つ大きくし、値を1024で割ります。 31 // これを適切な単位になるまで繰り返します。 32 // 例: 1024 B -> 1 KB, 1024 KB -> 1 MB 33 while ($bytes >= 1024 && $i < count($units) - 1) { 34 $bytes /= 1024; 35 $i++; 36 } 37 38 // number_format() で数値をフォーマットします。 39 // 1桁の小数点以下を表示し、適切な単位を付与します。 40 return number_format($bytes, 1, '.', '') . ' ' . $units[$i]; 41} 42 43// --- サンプルコードの実行例 --- 44 45// 1. テスト用のファイルを作成します。 46// 例として、約 250KB のファイルを作成します。 47$testFilename = 'example_file_for_filesize.txt'; 48$fileContent = str_repeat('A', 1024 * 250); // 'A' を250KB分繰り返します 49file_put_contents($testFilename, $fileContent); 50 51echo "--- ファイルが存在する場合のテスト ---\n"; 52echo "ファイル名: " . $testFilename . "\n"; 53// 作成したファイルのサイズを表示します。 54echo "ファイルサイズ: " . getHumanReadableFileSize($testFilename) . "\n\n"; 55 56// 2. 存在しないファイルのサイズをテストします。 57$nonExistentFile = 'non_existent_file.txt'; 58echo "--- ファイルが存在しない場合のテスト ---\n"; 59echo "ファイル名: " . $nonExistentFile . "\n"; 60// 存在しないファイルのサイズを表示しようとします。 61echo "ファイルサイズ: " . getHumanReadableFileSize($nonExistentFile) . "\n\n"; 62 63// 3. テスト用に作成したファイルを削除し、クリーンアップします。 64if (file_exists($testFilename)) { 65 unlink($testFilename); 66 echo "テストファイル '" . $testFilename . "' を削除しました。\n"; 67} 68 69?>
PHPのfilesize関数は、引数で指定されたファイルのサイズを取得するための関数です。引数には、サイズを調べたいファイルのパスを文字列として渡します。
この関数が正常に実行されると、ファイルのサイズが「バイト」単位の整数で返されます。もし指定したファイルが存在しない、あるいはアクセス権限がないなどの理由でサイズの取得に失敗した場合は、数値ではなくfalseが返されます。そのため、戻り値がfalseかどうかを厳密にチェックすることで、エラー処理を適切に行うことができます。
filesize関数が返す値は常にバイト単位であるため、KB(キロバイト)やMB(メガバイト)といった、より人間が直感的に理解しやすい単位で表示したい場合は、自分で計算処理を追加する必要があります。
提示されたサンプルコードは、この単位変換を行う良い例です。まずfilesizeでバイト単位のサイズを取得し、その値が1024以上であれば1024で割る、という処理を繰り返します。この割り算を何回行ったかに応じて、B(バイト)、KB、MBといった適切な単位を選択し、数値をフォーマットして表示用の文字列を生成しています。このようにfilesize関数と簡単な計算を組み合わせることで、利用者にとって分かりやすいファイルサイズの表示を実現できます。
filesize()関数はファイルのサイズをバイト単位の数値で返しますが、ファイルが存在しない、またはアクセス権限がない場合はfalseを返します。そのため、サンプルコードのように===演算子で戻り値がfalseかどうかを厳密に比較することが重要です。これにより、サイズが0バイトの場合とエラーとを明確に区別できます。この関数はファイルにのみ有効で、ディレクトリに対して使用するとエラーになる点にも注意が必要です。また、サンプルコードでは1KBを1024バイトとして計算していますが、システムによっては1000バイトを基準とすることもあります。
PHP filesize 取得できない原因と対処法
1<?php 2 3/** 4 * ファイルサイズを取得し、取得できない場合の一般的な原因をチェックして表示します。 5 * 6 * @param string $filename チェック対象のファイルパス 7 */ 8function displayFileSize(string $filename): void 9{ 10 echo "--- チェック対象: '{$filename}' ---" . PHP_EOL; 11 12 // filesize()を呼び出す前に、キャッシュをクリアして最新の状態を取得します。 13 // ファイルが直前に変更された場合などに古い情報が返されるのを防ぎます。 14 clearstatcache(); 15 16 // 1. ファイルが存在するかチェック 17 if (!file_exists($filename)) { 18 echo "エラー: ファイルが存在しません。" . PHP_EOL; 19 echo PHP_EOL; 20 return; 21 } 22 23 // 2. ディレクトリではないかチェック 24 // filesize()はディレクトリのサイズを取得できません。 25 if (is_dir($filename)) { 26 echo "エラー: ディレクトリのサイズは取得できません。" . PHP_EOL; 27 echo PHP_EOL; 28 return; 29 } 30 31 // filesize()は失敗すると false を返します。 32 // 戻り値が 0 (空ファイル) の場合と区別するために、厳密な比較 (===) を行います。 33 $size = filesize($filename); 34 35 if ($size === false) { 36 // file_exists() で存在は確認済みなので、ここに来る原因は 37 // 主にパーミッション(読み取り権限)の問題が考えられます。 38 echo "エラー: ファイルサイズの取得に失敗しました。読み取り権限がない可能性があります。" . PHP_EOL; 39 } else { 40 echo "ファイルサイズは {$size} バイトです。" . PHP_EOL; 41 } 42 43 echo PHP_EOL; 44} 45 46// --- サンプル実行 --- 47 48// 1. 成功するケース: テスト用のファイルを作成 49$successFile = 'sample.txt'; 50file_put_contents($successFile, 'Hello, PHP!'); 51displayFileSize($successFile); 52 53// 2. 失敗するケース (ファイルが存在しない) 54$nonExistentFile = 'non_existent_file.txt'; 55displayFileSize($nonExistentFile); 56 57// 3. 失敗するケース (対象がディレクトリ) 58$directoryName = 'test_dir'; 59if (!is_dir($directoryName)) { 60 mkdir($directoryName); 61} 62displayFileSize($directoryName); 63 64 65// --- 後片付け --- 66if (file_exists($successFile)) { 67 unlink($successFile); 68} 69if (is_dir($directoryName)) { 70 rmdir($directoryName); 71}
このPHPサンプルコードは、filesize()関数を使ってファイルのサイズを取得する方法と、サイズが取得できない場合の一般的な原因と対処法を示しています。
filesize()は、引数に指定されたファイルパス($filename)のサイズをバイト単位で取得する関数です。処理が成功するとファイルサイズを整数(int)で返し、失敗するとfalseを返します。ファイルサイズが0バイトの場合と、処理が失敗した場合のfalseとを明確に区別するため、サンプルコードでは厳密な比較演算子(===)を用いています。
ファイルサイズが取得できない主な原因には、「ファイルが存在しない」「対象がディレクトリである」「読み取り権限がない」といったケースが考えられます。このコードでは、filesize()を呼び出す前にfile_exists()でファイルの存在を、is_dir()でディレクトリでないことを事前にチェックしています。これらの確認を経てもサイズ取得に失敗する場合、読み取り権限が不足している可能性が高いと判断できます。
また、ファイルのステータスはキャッシュされることがあるため、clearstatcache()を事前に実行することで、直前の変更が反映された最新のファイルサイズを確実に取得するようにしています。
filesize関数は、ファイルサイズが0バイトの場合に数値の0を、取得に失敗した場合に論理値のfalseを返します。この2つを明確に区別するため、戻り値を判定する際は === 演算子による厳密な比較が必須です。関数が失敗する主な原因は、ファイルが存在しない、対象がディレクトリである、読み取り権限がないといったケースです。そのため、関数を呼び出す前にfile_exists関数などで事前チェックを行うことが、安全なプログラムを作成する上で重要となります。また、ファイルが直前に更新された際に古い情報が返されることを防ぐため、clearstatcache関数でキャッシュをクリアすると、より確実に最新のファイルサイズを取得できます。