【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 * ファイルが存在しない、または読み取り権限がない場合はエラーを処理します。 6 * 7 * @param string $filename ファイルのパス 8 * @return void 9 */ 10function displayFilesize(string $filename): void 11{ 12 echo "ファイル名: " . $filename . PHP_EOL; 13 14 // filesize関数は、ファイルのサイズをバイト単位で返します。 15 // ファイルが存在しない、または読み取り権限がない場合は false を返します。 16 $size = filesize($filename); 17 18 if ($size === false) { 19 // filesizeが false を返した場合、ファイルサイズの取得に失敗しています。 20 // これはファイルが存在しない、またはプログラムにファイルへの読み取り権限がない場合に発生します。 21 echo "エラー: ファイルのサイズを取得できませんでした。ファイルが存在しないか、読み取り権限がありません。" . PHP_EOL; 22 } else { 23 echo "サイズ: " . $size . " バイト" . PHP_EOL; 24 } 25 echo PHP_EOL; // 出力を見やすくするための区切り 26} 27 28// --- サンプルコードの実行例 --- 29 30// 1. 存在するファイルのサイズを取得する例 31// 現在実行中のスクリプトファイル自体を対象とします。 32$existingFile = __FILE__; 33displayFilesize($existingFile); 34 35// 2. 存在しないファイルのサイズを取得しようとしてエラーになる例 36// 存在しないファイルパスを指定してください。 37$nonExistentFile = 'path/to/non_existent_file.txt'; 38displayFilesize($nonExistentFile); 39 40// 3. (補足) アクセス権がない場合の例 41// 実際の環境でアクセス権エラーを再現することは難しいですが、 42// 読み取り権限がないファイルに対しても filesize は false を返します。 43// 例: 通常のユーザーがアクセスできない '/root/secret.txt' のようなファイルを指定した場合。 44// $noPermissionFile = '/path/to/file_without_read_permission.txt'; 45// displayFilesize($noPermissionFile); 46
PHP 8で提供されるfilesize関数は、指定されたファイルのサイズをバイト単位で取得するために使用されます。この関数は、引数としてサイズを知りたいファイルのパスを文字列で受け取ります。処理に成功するとファイルのサイズを整数値で返しますが、ファイルが存在しない場合や、ファイルへの読み取り権限がない場合にはfalseを返します。
サンプルコードでは、displayFilesizeという関数内でfilesize関数を呼び出し、その戻り値を詳細にチェックしています。具体的には、filesizeがfalseを返した場合、ファイルサイズの取得に失敗したと判断し、「ファイルが存在しないか、読み取り権限がありません」というエラーメッセージを表示します。そうでない場合は、取得できたファイルのサイズをバイト数で表示します。
この例では、__FILE__という定数を使って現在実行中のスクリプト自身のサイズを取得する成功パターンと、存在しないファイルパスを指定してfilesizeがfalseを返し、エラー処理が行われるパターンを示しています。このように、filesize関数の戻り値を適切に確認し、エラー時に適切な処理を行うことは、システムエンジニアとして堅牢なプログラムを作成する上で非常に重要です。
filesize関数は、指定されたファイルのサイズをバイト単位で返しますが、ファイルが存在しない場合や、プログラムに読み取り権限がない場合はfalseを返します。したがって、取得した値がfalseでないかを常に厳密にチェックし、適切なエラー処理を実装することが非常に重要です。if ($size === false)のように厳密な比較を使用してください。このエラーハンドリングは、ファイルが見つからない状況や、アクセス権限がない場合にプログラムの予期せぬ停止を防ぎ、安全な動作を保証するために不可欠です。また、引数に指定するファイルパスが正しいかどうかも確認が必要です。
PHPでファイルサイズをGB単位で取得する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 指定されたファイルのサイズをギガバイト (GB) 単位で取得します。 7 * 8 * この関数は、PHPの`filesize`関数を利用してファイルのバイト数を取得し、 9 * それをギガバイトに変換します。 10 * 11 * filesize関数は、ファイルが存在しない場合やアクセス権がない場合に`false`を返します。 12 * PHP 8 (特に64ビットシステム) では、filesize関数は通常2GBを超えるファイルサイズも 13 * 問題なく正確に取得できます。例えば、2.5GBのファイルであれば、約2684354560バイトを返します。 14 * 15 * @param string $filename ファイルパス 16 * @return float|false ファイルサイズ (GB) を返すか、エラーの場合は false を返します。 17 */ 18function getFileSizeInGB(string $filename): float|false 19{ 20 // filesize関数を呼び出して、ファイルのバイト数を取得します。 21 // 戻り値は整数 (int) または失敗時に false です。 22 $bytes = filesize($filename); 23 24 if ($bytes === false) { 25 // filesize関数が失敗した場合(例: ファイルが存在しない、読み取り権限がない) 26 return false; 27 } 28 29 // バイト数をギガバイトに変換します。 30 // 1 GB = 1024 MB = 1024 * 1024 KB = 1024 * 1024 * 1024 Bytes 31 // 計算結果は浮動小数点数になるため、float型で扱います。 32 $gigabytes = $bytes / (1024 * 1024 * 1024); 33 34 return $gigabytes; 35} 36 37// --- サンプル使用例 --- 38// 実行する前に、実際に存在するファイルのパスに置き換えてください。 39// または、テスト用に小さなファイルを作成して試してみてください。 40 41// 例1: 存在するファイルのサイズを取得する 42// $existingFilePath = __DIR__ . '/my_large_file.zip'; // ここを実際のファイルパスに置き換えてください 43$existingFilePath = __DIR__ . '/example.txt'; // 簡単な例として、このファイルと同じディレクトリに 'example.txt' を作成してみてください。 44 // 例: echo "Hello World" > example.txt 45 46// ファイルが存在しない場合は、一時的に作成して試すこともできます。 47if (!file_exists($existingFilePath)) { 48 // 便宜上、ダミーファイルを作成します (約100バイト) 49 file_put_contents($existingFilePath, str_repeat('A', 100)); 50 echo "テスト用ファイル '{$existingFilePath}' を作成しました。\n"; 51} 52 53$sizeGb = getFileSizeInGB($existingFilePath); 54 55if ($sizeGb === false) { 56 echo "エラー: ファイル '{$existingFilePath}' のサイズを取得できませんでした。\n"; 57 echo "ファイルが存在するか、読み取り権限があるか確認してください。\n"; 58} else { 59 // 結果を小数点以下2桁で表示 60 echo "ファイル '{$existingFilePath}' のサイズ: " . sprintf("%.2f", $sizeGb) . " GB\n"; 61} 62 63echo "\n"; // 区切り 64 65// 例2: 存在しないファイルのサイズを取得する 66$nonExistentFilePath = __DIR__ . '/non_existent_file.txt'; 67$sizeGbNonExistent = getFileSizeInGB($nonExistentFilePath); 68 69if ($sizeGbNonExistent === false) { 70 echo "エラー: ファイル '{$nonExistentFilePath}' のサイズを取得できませんでした。\n"; 71 echo "ファイルが存在しないか、読み取り権限がないためです。\n"; 72} else { 73 // このブロックは通常実行されません 74 echo "ファイル '{$nonExistentFilePath}' のサイズ: " . sprintf("%.2f", $sizeGbNonExistent) . " GB\n"; 75} 76 77// テスト用ファイルのクリーンアップ(オプション) 78if (file_exists($existingFilePath) && strpos($existingFilePath, 'example.txt') !== false) { 79 unlink($existingFilePath); 80 echo "\nテスト用ファイル '{$existingFilePath}' を削除しました。\n"; 81} 82
PHPのfilesize関数は、指定されたファイルのサイズをバイト単位で取得するための関数です。引数には、サイズを知りたいファイルのパスを文字列として渡します。処理が成功すると、ファイルのサイズが整数(int)で返されますが、ファイルが存在しない場合や読み取り権限がない場合はfalseが戻り値となります。PHP 8の64ビットシステムでは、この関数は通常2GBを超えるような非常に大きなファイルのサイズも正確に取得可能です。
サンプルコードでは、このfilesize関数を用いて、ファイルのバイト数をギガバイト(GB)単位に変換して返すgetFileSizeInGBというカスタム関数を定義しています。この関数は、内部でfilesizeを呼び出し、その結果がfalseであれば、そのままエラーとしてfalseを返します。これにより、呼び出し元でファイルが見つからないなどの問題を適切に処理できます。取得したバイト数を「1024 * 1024 * 1024」で割ることでGB単位に変換し、浮動小数点数(float)として返します。使用例では、実際に存在するファイルと存在しないファイルの両方に対してこの関数を適用し、結果の表示とエラー処理の動作を示しています。
filesize関数は、ファイルのサイズをバイト単位で整数で返しますが、ファイルが見つからない場合や読み取り権限がない場合はfalseを返します。プログラムが予期せぬ動作をしないよう、このfalseが返された場合を必ず確認し、適切にエラー処理を行うことが重要です。PHP 8の64ビットシステム環境では、2GBを超えるファイルサイズも問題なく正確に取得できますので、以前のバージョンでの制限は解消されています。サンプルコードではバイトからギガバイトへの変換を行っており、計算結果は浮動小数点数となるため、結果表示時には小数点以下の桁数を調整すると見やすくなります。サンプルコードを実行する際は、$existingFilePathを必ず実際に存在するファイルのパスに置き換えてください。また、テスト用に一時ファイルを作成した場合は、実行後にそのファイルを削除するクリーンアップ処理を含めることを推奨します。
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関数でキャッシュをクリアすると、より確実に最新のファイルサイズを取得できます。