【PHP8.x】DirectoryIterator::getCTime()メソッドの使い方
getCTimeメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getCTimeメソッドは、DirectoryIteratorオブジェクトが現在指しているファイルまたはディレクトリのiノード変更時刻(ctime)を取得するメソッドです。この時刻は、ファイルの内容が更新された「最終更新時刻」(getMTimeメソッドが返すもの)や、ファイルが最後に読み込まれた「最終アクセス時刻」(getATimeメソッドが返すもの)とは異なる性質を持っています。
具体的に、iノード変更時刻が何を指すかはオペレーティングシステムによって異なります。Windows環境では、一般的にファイルの作成時刻として扱われることが多いです。一方、Unix系のシステムでは、ファイルの内容そのものではなく、ファイルのパーミッション、所有者、グループ、またはリンク数といったファイルのメタデータ(iノード情報)が変更された時刻を指します。例えば、ファイルのアクセス権限が変更された際に、このgetCTimeメソッドが返す時刻が更新されます。
このメソッドは、取得した時刻をUnixタイムスタンプ形式の整数値として返します。Unixタイムスタンプとは、1970年1月1日00:00:00 UTCからの経過秒数を表す数値です。このタイムスタンプは、date()関数などを使って読みやすい日付や時刻の形式に変換したり、他のタイムスタンプと比較してファイルの変更履歴を追跡したりする際に利用できます。ファイルのメタデータの変更監視や、特定の条件でファイルをフィルタリングするなどの場面で役立ちます。
構文(syntax)
1<?php 2$iterator = new DirectoryIterator('.'); 3foreach ($iterator as $file) { 4 if ($file->isFile()) { 5 $inodeChangeTime = $file->getCTime(); 6 break; 7 } 8} 9?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int|false
このメソッドは、ディレクトリ内のエントリ(ファイルやサブディレクトリ)のinodeの変更時刻を整数値で返します。時刻はUnixエポックからの秒数で表されます。エラーが発生した場合はfalseを返します。
サンプルコード
PHP DirectoryIterator::getCTime でinode最終変更時刻を取得する
1<?php 2 3/** 4 * 現在のディレクトリ内のファイルやディレクトリの inode 最終変更タイムスタンプを表示します。 5 * 6 * DirectoryIterator を使用してディレクトリ内のエントリを反復処理し、 7 * 各エントリの inode 最終変更タイムスタンプ (Unix タイムスタンプ) を取得します。 8 * 取得したタイムスタンプは、date() 関数を使って人間が読める形式に変換して表示します。 9 */ 10 11// 現在のディレクトリを示す "." を引数に DirectoryIterator をインスタンス化します。 12// これにより、カレントディレクトリ内のファイルやサブディレクトリを操作できるようになります。 13try { 14 $iterator = new DirectoryIterator('.'); 15 16 echo "現在のディレクトリ内のファイル/ディレクトリのinode最終変更タイムスタンプ:\n\n"; 17 18 // ディレクトリ内の各エントリ (ファイルやサブディレクトリ) をループ処理します。 19 foreach ($iterator as $fileInfo) { 20 // "." と ".." は特殊なディレクトリ参照なのでスキップします。 21 if ($fileInfo->isDot()) { 22 continue; 23 } 24 25 // ファイルまたはディレクトリの名前を取得します。 26 $filename = $fileInfo->getFilename(); 27 28 // getCTime() メソッドで inode の最終変更時刻を Unix タイムスタンプで取得します。 29 // inode の最終変更時刻は、ファイルの内容、メタデータ、またはパーミッションが変更されたことを示します。 30 // 戻り値は整数 (タイムスタンプ) または false (エラーの場合) です。 31 $timestamp = $fileInfo->getCTime(); 32 33 if ($timestamp !== false) { 34 // タイムスタンプが正常に取得できた場合、人間が読める日付形式に変換して表示します。 35 $readableDate = date('Y-m-d H:i:s', $timestamp); 36 echo "ファイル/ディレクトリ: " . $filename . "\n"; 37 echo " inode最終変更タイムスタンプ (UNIX): " . $timestamp . "\n"; 38 echo " 日付形式: " . $readableDate . "\n"; 39 } else { 40 // タイムスタンプの取得に失敗した場合のエラーメッセージを表示します。 41 echo "ファイル/ディレクトリ: " . $filename . "\n"; 42 echo " inode最終変更タイムスタンプの取得に失敗しました。\n"; 43 } 44 echo "\n"; 45 } 46} catch (RuntimeException $e) { 47 // DirectoryIterator のインスタンス化やイテレーション中にエラーが発生した場合 (例: 読み取り権限がない場合) 48 echo "エラーが発生しました: " . $e->getMessage() . "\n"; 49} 50 51?>
PHP 8のDirectoryIterator::getCTimeメソッドは、ファイルやディレクトリの「inode最終変更タイムスタンプ」を取得するために用いられます。このタイムスタンプは、ファイルの内容だけでなく、パーミッションや所有者などのメタデータが最後に変更された時刻を、Unixタイムスタンプ(1970年1月1日からの秒数)として表します。
このメソッドは引数を必要としません。戻り値は、タイムスタンプが正常に取得できた場合は整数(int)でUnixタイムスタンプを返し、取得に失敗した場合はfalseを返します。
提供されたサンプルコードでは、まずDirectoryIteratorクラスを用いて現在のディレクトリ内のファイルやサブディレクトリを順に処理しています。ループ内で各ファイルやディレクトリに対してgetCTime()メソッドを呼び出し、それぞれのinode最終変更タイムスタンプを取得します。取得したタイムスタンプは、date()関数を使って「YYYY-MM-DD HH:MM:SS」のような、人間が読みやすい日付形式に変換して表示しています。タイムスタンプの取得が成功したかどうかも確認し、失敗した場合にはその旨をユーザーに伝えるエラーハンドリングも実装されており、try-catchブロックで全体のエラーも捕捉する堅牢な作りとなっています。
getCTime()はファイルやディレクトリの「inode最終変更タイムスタンプ」を整数で返します。これはファイル内容だけでなく、アクセス権などのメタデータ変更でも更新される点にご注意ください。戻り値はUnixタイムスタンプなので、人間が読める形式にはdate()関数での変換が必要です。また、取得に失敗するとfalseが返るため、必ず!== falseで戻り値をチェックし、適切にエラー処理を行ってください。ディレクトリの反復処理では、特殊なエントリ「.」と「..」をスキップすることが一般的です。ファイルへのアクセス権限不足などによるエラーに備え、try-catchブロックで例外を捕捉する安全なコード記述を心がけてください。