【PHP8.x】DirectoryIterator::getMTime()メソッドの使い方
getMTimeメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getMTimeメソッドは、DirectoryIteratorオブジェクトが現在指し示しているファイルまたはディレクトリの最終更新時刻を取得するメソッドです。このメソッドは、ファイルやディレクトリの内容が最後に変更された日時を、Unixタイムスタンプという形式の整数値として返します。Unixタイムスタンプは、1970年1月1日 00:00:00 GMT(協定世界時)からの経過秒数を表しており、プログラミングにおいて日時を数値で扱う際によく用いられます。
システムエンジニアがファイルを管理する際、どのファイルがいつ更新されたかを知ることは非常に重要です。例えば、バックアップシステムで前回バックアップ以降に更新されたファイルのみを対象にしたり、キャッシュシステムで古いファイルを自動的に削除したりする場合に、この最終更新時刻が役立ちます。
DirectoryIteratorクラスは、指定されたディレクトリ内のすべてのファイルやサブディレクトリを順番に走査(たどる)するための機能を提供します。その走査中に、各ファイルやディレクトリに対してgetMTimeメソッドを呼び出すことで、それぞれの最終更新時刻を簡単に取得できます。
返される値は通常、最終更新時刻を示す整数ですが、ファイルが存在しない場合や、何らかの理由で時刻の取得に失敗した場合にはfalseを返すこともあります。取得したタイムスタンプは、PHPのdate()関数などと組み合わせて、YYYY-MM-DD HH:MM:SSのような人間が読みやすい形式に変換することが可能です。このメソッドを使うことで、ファイルシステムの情報を効率的に操作し、アプリケーションの要件に応じた柔軟な処理を実装できるようになります。
構文(syntax)
1<?php 2// 現在のディレクトリを対象とするDirectoryIteratorオブジェクトを作成 3$directoryIterator = new DirectoryIterator('.'); 4 5// ディレクトリ内の各ファイルやディレクトリを順に処理 6foreach ($directoryIterator as $itemInfo) { 7 // $itemInfo は、各ファイルまたはディレクトリの情報を持つオブジェクトです。 8 // getMTime() メソッドを呼び出すことで、そのファイルまたはディレクトリの 9 // 最終更新時刻(Unixタイムスタンプ形式の整数)を取得します。 10 $modificationTime = $itemInfo->getMTime(); 11 12 // 構文を示すための短い例として、最初の要素で処理を終了します。 13 // 通常はここで、$modificationTime を利用した処理を行います。 14 // 例: echo "ファイル/ディレクトリ名: " . $itemInfo->getFilename() . ", 更新時刻 (Unixタイムスタンプ): " . $modificationTime . "\n"; 15 break; 16} 17?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int|false
DirectoryIterator::getMTime は、ファイルまたはディレクトリの最終変更時刻を Unix タイムスタンプ(1970年1月1日午前0時からの経過秒数)として整数で返します。エラーが発生した場合は false を返します。
サンプルコード
PHP DirectoryIteratorでファイル更新時刻を取得する
1<?php 2 3/** 4 * 指定されたディレクトリ内の各ファイルとディレクトリの最終更新時刻を表示します。 5 * 6 * @param string $directoryPath 検査するディレクトリのパス 7 * @return void 8 */ 9function displayFileModificationTimes(string $directoryPath): void 10{ 11 // ディレクトリが存在し、読み取り可能か確認 12 if (!is_dir($directoryPath)) { 13 echo "エラー: ディレクトリ '{$directoryPath}' が見つからないか、読み取れません。\n"; 14 return; 15 } 16 17 echo "ディレクトリ: '{$directoryPath}' 内のアイテムの最終更新時刻:\n"; 18 echo "--------------------------------------------------\n"; 19 20 try { 21 // DirectoryIterator クラスを使用してディレクトリ内のアイテムを反復処理 22 // これにより、ディレクトリ内のファイルやサブディレクトリの情報を取得できます。 23 $iterator = new DirectoryIterator($directoryPath); 24 25 foreach ($iterator as $fileInfo) { 26 // 現在のアイテムが「.」または「..」である場合はスキップします。 27 // これらは現在のディレクトリと親ディレクトリを表し、通常は除外されます。 28 if ($fileInfo->isDot()) { 29 continue; 30 } 31 32 $filename = $fileInfo->getFilename(); 33 34 // getMTime() メソッドで最終更新時刻(Unixタイムスタンプ)を取得します。 35 // 失敗した場合は false を返します。 36 $modificationTimestamp = $fileInfo->getMTime(); 37 38 if ($modificationTimestamp !== false) { 39 // 取得したタイムスタンプを人間が読める「年-月-日 時:分:秒」形式に変換 40 $formattedTime = date('Y-m-d H:i:s', $modificationTimestamp); 41 echo " {$filename}: {$formattedTime}\n"; 42 } else { 43 echo " {$filename}: 最終更新時刻を取得できませんでした。\n"; 44 } 45 } 46 } catch (Exception $e) { 47 // DirectoryIterator の作成中にエラーが発生した場合 (例: 無効なパス) 48 echo "エラーが発生しました: " . $e->getMessage() . "\n"; 49 } 50 echo "--------------------------------------------------\n"; 51} 52 53// サンプルとして、このスクリプトが実行されている現在のディレクトリを指定します。 54// これにより、一時ファイルなどを作成する手間なく、動作を確認できます。 55$currentDirectory = __DIR__; 56displayFileModificationTimes($currentDirectory); 57 58?>
このPHPコードは、DirectoryIteratorクラスとgetMTime()メソッドを使用して、指定されたディレクトリ内のファイルやサブディレクトリの最終更新時刻を表示する方法を示しています。
まず、検査したいディレクトリのパスをDirectoryIteratorクラスに渡し、そのディレクトリ内のアイテムを一つずつ操作できるように準備します。その後、ループ処理で各ファイルやディレクトリの情報を取り出します。それぞれのアイテムに対してgetMTime()メソッドを呼び出すことで、そのアイテムが最後に更新された日時をUnixタイムスタンプ形式で取得できます。
getMTime()メソッドは引数を必要とせず、最終更新時刻を整数値(Unixタイムスタンプ)として返します。もし何らかの理由で更新時刻の取得に失敗した場合は、falseが返されるため、コードではその場合分けも考慮されています。取得したタイムスタンプは、date()関数と組み合わせることで、「年-月-日 時:分:秒」のような人間が読みやすい形式に変換され、画面に出力されます。このサンプルは、ファイルシステムの情報をプログラムで扱う際の基礎を理解するのに役立ちます。
getMTime()メソッドは、ファイルの最終更新時刻をUnixタイムスタンプとして返しますが、取得に失敗した場合はfalseを返します。そのため、戻り値がfalseでないか!== falseで必ず確認し、失敗時の処理を記述してください。Unixタイムスタンプはそのままでは読みにくいため、date()関数などを使って人間が読める形式に変換する必要があります。
DirectoryIteratorを使用する際は、指定されたディレクトリが存在し、読み取り可能であるかis_dir()で事前に確認し、操作中に発生する可能性のある例外をtry-catchで適切に処理することが安全なコードの基本です。ファイルやディレクトリの読み取り権限がない場合も、更新時刻が取得できないことがありますので注意が必要です。