【PHP8.x】FilesystemIterator::getCTime()メソッドの使い方
getCTimeメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getCTimeメソッドは、FilesystemIteratorクラスにおいて、現在イテレート中のファイルまたはディレクトリのinode変更時刻を取得するメソッドです。FilesystemIteratorは、ファイルシステム内の項目(ファイルやディレクトリ)を順次処理する際に使用されるもので、このメソッドはその過程で各項目の詳細な情報を得るために利用されます。
このメソッドが取得する「inode変更時刻」とは、ファイルのデータ内容が最後に変更された時刻(更新時刻、mtime)とは異なります。inode変更時刻は、ファイルのパーミッション(アクセス権限)、所有者、グループ、リンク数といった、ファイルシステムが管理するメタデータ(属性情報)が最後に変更された時刻を指します。例えば、ファイルの読み書き権限を変更したり、ファイルの所有者を変更したりした場合に、このinode変更時刻が更新されます。
getCTimeメソッドは、この変更時刻をUNIXタイムスタンプ形式の整数値として返します。UNIXタイムスタンプは、1970年1月1日0時0分0秒(UTC)からの経過秒数を示す数値であり、PHPのdate()関数などと組み合わせて、人間が読みやすい形式の日付や時刻に変換することができます。ファイルシステムのメタデータの変更履歴を追跡したり、特定の属性変更に基づいてファイルを識別したりする際に、このメソッドは有用です。ファイル情報の取得に失敗した場合は、falseが返されることがありますので、その点も考慮してプログラムを記述することが重要です。
構文(syntax)
1<?php 2$iterator = new FilesystemIterator(__DIR__); 3$ctime = $iterator->getCTime(); 4?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
このメソッドは、ファイルまたはディレクトリの作成時刻を表す整数値を返します。
サンプルコード
PHP getCTimeでinode変更時刻を取得する
1<?php 2 3/** 4 * プログラミング初心者のシステムエンジニア向けに 5 * FilesystemIterator::getCTime() の使用例を示します。 6 * 7 * FilesystemIterator::getCTime() は、ファイルやディレクトリの 8 * inode (メタデータ) が最後に変更された時刻をUnixタイムスタンプ (整数) で返します。 9 * これはコンテンツの最終変更時刻 (mtime) とは異なり、パーミッションの変更や 10 * ファイル名の変更、所有者の変更など、inode 自体への変更があった場合に更新されます。 11 */ 12 13// 一時的なディレクトリとファイルを作成してデモンストレーションを行います 14$tempDir = 'php_getctime_test_' . uniqid(); // 重複しない一時ディレクトリ名 15$tempFile = $tempDir . DIRECTORY_SEPARATOR . 'sample_file.txt'; 16 17try { 18 // 1. 一時ディレクトリの作成 19 if (!mkdir($tempDir, 0777, true)) { 20 throw new RuntimeException("一時ディレクトリ '{$tempDir}' の作成に失敗しました。"); 21 } 22 echo "一時ディレクトリを作成しました: " . $tempDir . "\n"; 23 24 // 2. 一時ファイルの作成と内容の書き込み 25 // この操作により、ファイルの inode 変更時刻 (ctime) が設定されます。 26 if (file_put_contents($tempFile, "Hello, PHP System Engineers!\n") === false) { 27 throw new RuntimeException("一時ファイル '{$tempFile}' の作成に失敗しました。"); 28 } 29 echo "一時ファイルを作成しました: " . $tempFile . "\n\n"; 30 31 // 3. FilesystemIterator をインスタンス化 32 // 指定されたディレクトリのファイルシステム項目を反復処理します。 33 // FilesystemIterator::KEY_AS_PATHNAME は、キーをファイルのフルパスにします。 34 // FilesystemIterator::CURRENT_AS_FILEINFO は、値を SplFileInfo オブジェクトにします。 35 $iterator = new FilesystemIterator($tempDir, FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO); 36 37 echo "ディレクトリ内のファイルを走査し、ctime を取得します:\n"; 38 39 // 4. ディレクトリ内の各項目を反復処理 40 foreach ($iterator as $pathname => $fileInfo) { 41 echo " 項目名: " . $fileInfo->getFilename() . "\n"; 42 echo " フルパス: " . $pathname . "\n"; 43 44 // 5. getCTime() メソッドを使用して inode 変更時刻 (Unixタイムスタンプ) を取得 45 $cTime = $fileInfo->getCTime(); 46 echo " inode 変更時刻 (Unixタイムスタンプ): " . $cTime . "\n"; 47 48 // 6. Unixタイムスタンプを人間が読める形式に変換 49 // DateTimeImmutable は不変のオブジェクトで、日付操作に推奨されます。 50 $dateTime = new DateTimeImmutable('@' . $cTime); // @ を付けてUnixタイムスタンプを指定 51 echo " 人間が読める形式: " . $dateTime->format('Y-m-d H:i:s') . "\n\n"; 52 } 53 54} catch (Exception $e) { 55 echo "エラーが発生しました: " . $e->getMessage() . "\n"; 56} finally { 57 // 7. 使用した一時ファイルとディレクトリのクリーンアップ 58 // スクリプトの実行後に不要なファイルが残らないようにします。 59 echo "クリーンアップを開始します...\n"; 60 if (file_exists($tempFile)) { 61 unlink($tempFile); // ファイルを削除 62 echo "一時ファイルを削除しました: " . $tempFile . "\n"; 63 } 64 if (file_exists($tempDir)) { 65 rmdir($tempDir); // ディレクトリを削除 66 echo "一時ディレクトリを削除しました: " . $tempDir . "\n"; 67 } 68 echo "クリーンアップが完了しました。\n"; 69} 70 71?>
FilesystemIterator::getCTime() メソッドは、ファイルやディレクトリのメタデータ、特に「inode」と呼ばれるファイルシステムの構造情報が最後に変更された時刻をUnixタイムスタンプ(整数値)で取得します。このメソッドは引数を必要とせず、常にUnixタイムスタンプを表す整数値を返します。取得される時刻は、ファイルの内容が変更された時刻(mtime)とは異なります。例えば、ファイルのパーミッションが変更された場合や、ファイルの名前、所有者が変更された場合など、ファイルシステム上の情報自体が更新されたときにこのinode変更時刻(ctime)が記録されます。
サンプルコードでは、まず一時的なディレクトリとファイルを作成し、そのファイルに対してFilesystemIteratorを使ってアクセスする方法を示しています。FilesystemIteratorは、指定されたディレクトリ内の項目を一つずつ走査するためのクラスで、その各項目はSplFileInfoオブジェクトとして表現されます。このSplFileInfoオブジェクトからgetCTime()メソッドを呼び出すことで、当該ファイルのinode変更時刻をUnixタイムスタンプとして取得できます。取得したタイムスタンプは、そのままでは人間には読みにくいため、DateTimeImmutableクラスを利用して「YYYY-MM-DD HH:MM:SS」のような、より分かりやすい日付と時刻の形式に変換しています。この機能は、ファイルのシステムレベルでの変更履歴を追跡する際に役立ちます。
FilesystemIterator::getCTime()は、ファイルやディレクトリの「inode(メタデータ)が最後に変更された時刻」をUnixタイムスタンプで返します。これは、ファイル内容の最終変更時刻(mtime)とは異なり、パーミッションやファイル名の変更などで更新されますので混同しないようご注意ください。戻り値は整数型のUnixタイムスタンプのため、人間が読める形式にするにはDateTimeImmutableなどのクラスでの変換が必要です。ファイルシステムを扱うコードでは、エラーハンドリングや一時ファイルのクリーンアップを適切に行い、安全性を確保することが重要です。
PHP FilesystemIterator::getCTimeでinode変更時刻を取得する
1<?php 2 3// 1. サンプル用の作業ディレクトリと一時ファイルを作成します。 4// これにより、FilesystemIteratorが処理する対象を準備します。 5$tempDir = __DIR__ . DIRECTORY_SEPARATOR . 'sample_dir_' . uniqid(); 6if (!mkdir($tempDir) && !is_dir($tempDir)) { 7 echo "エラー: 一時ディレクトリ '{$tempDir}' の作成に失敗しました。\n"; 8 exit(1); 9} 10 11// 一つ目のファイルを生成し、内容を書き込みます。 12$tempFile1 = $tempDir . DIRECTORY_SEPARATOR . 'file1.txt'; 13file_put_contents($tempFile1, 'Hello PHP'); 14// ファイルのinode変更時刻 (cTime) を意図的に変更するために、touch関数を使用します。 15// ここでは1時間前の時刻に設定しています。 16touch($tempFile1, time() - 3600); 17 18// 二つ目のファイルを生成します。 19$tempFile2 = $tempDir . DIRECTORY_SEPARATOR . 'file2.txt'; 20file_put_contents($tempFile2, 'World!'); 21 22/** 23 * 指定されたディレクトリ内のファイルシステムオブジェクトのinode変更時刻 (cTime) を取得し表示します。 24 * 25 * @param string $directoryPath 処理対象のディレクトリパス。 26 */ 27function displayFileChangeTimes(string $directoryPath): void 28{ 29 echo "--- ディレクトリ '{$directoryPath}' 内のファイル変更時刻 --- \n"; 30 try { 31 // FilesystemIterator をインスタンス化し、指定されたディレクトリ内の項目を反復処理します。 32 // FilesystemIterator::SKIP_DOTS フラグは、特殊なエントリである "." (カレントディレクトリ) と 33 // ".." (親ディレクトリ) をスキップするために使用します。 34 $iterator = new FilesystemIterator($directoryPath, FilesystemIterator::SKIP_DOTS); 35 36 // ディレクトリ内の各ファイルまたはサブディレクトリをループ処理します。 37 foreach ($iterator as $fileInfo) { 38 // ファイルまたはディレクトリの名前を取得し表示します。 39 echo "ファイル/ディレクトリ名: " . $fileInfo->getFilename(); 40 41 // getCTime() メソッドで inode の最終変更時刻(Change Time)をUNIXタイムスタンプ形式で取得します。 42 // inode変更時刻 (cTime) は、ファイルのパーミッション、所有者、グループ、 43 // またはファイルのデータ自体が変更された際に更新されます。 44 // これは通常、ファイルの最終更新時刻 (mTime) や最終アクセス時刻 (aTime) とは異なります。 45 $cTime = $fileInfo->getCTime(); 46 47 // 取得したUNIXタイムスタンプを読みやすい日付時刻形式に変換して表示します。 48 echo ", inode変更時刻 (UNIX): " . $cTime; 49 echo ", inode変更時刻 (フォーマット済): " . date('Y-m-d H:i:s', $cTime) . "\n"; 50 } 51 } catch (UnexpectedValueException $e) { 52 // 指定されたパスがディレクトリでない場合や、ディレクトリの読み取りに失敗した場合に 53 // UnexpectedValueException がスローされることがあります。 54 echo "エラー: ディレクトリの読み取り中に問題が発生しました: " . $e->getMessage() . "\n"; 55 } 56 echo "--------------------------------------------------\n"; 57} 58 59// 作成した一時ディレクトリを処理し、FilesystemIterator::getCTime() の結果を表示します。 60displayFileChangeTimes($tempDir); 61 62// 2. サンプル実行後、作成した一時ファイルとディレクトリをクリーンアップします。 63// これにより、不要なファイルがシステムに残るのを防ぎます。 64if (is_dir($tempDir)) { 65 // ディレクトリ内のファイルを削除します。 66 // scandir() でディレクトリの内容をリストアップし、"." と ".." を除外します。 67 $files = array_diff(scandir($tempDir), ['.', '..']); 68 foreach ($files as $file) { 69 unlink($tempDir . DIRECTORY_SEPARATOR . $file); 70 } 71 // 空になったディレクトリを削除します。 72 rmdir($tempDir); 73 echo "一時ディレクトリ '{$tempDir}' とその内容をクリーンアップしました。\n"; 74} 75 76?>
PHPのFilesystemIterator::getCTimeメソッドは、ファイルやディレクトリのinode変更時刻(cTime)を取得する際に利用されます。FilesystemIteratorは、指定されたディレクトリ内のファイルやサブディレクトリを効率的に繰り返し処理するためのクラスです。getCTimeメソッドは引数を取らず、戻り値として、inodeが最後に変更された時刻をUNIXタイムスタンプ形式の整数(int)で返します。inode変更時刻とは、ファイルのパーミッション、所有者、グループ、またはファイルデータ自体が変更された際に更新される時刻のことで、通常、ファイルの内容の最終更新時刻(mTime)や最終アクセス時刻(aTime)とは異なります。
サンプルコードでは、まず一時ディレクトリとファイルを作成し、一つ目のファイルに対してtouch関数を使い、意図的にcTimeを過去の時刻に変更しています。その後、FilesystemIteratorを用いてこの一時ディレクトリを走査し、各ファイルについて$fileInfo->getCTime()を呼び出してinode変更時刻を取得しています。取得したUNIXタイムスタンプは、date()関数を使って人間が読みやすい日付時刻形式に変換され、ファイル名とともに表示されます。これにより、touchで変更したファイルとそうでないファイルのcTimeの違いを比較できます。処理後には、作成された一時ディレクトリとファイルが適切に削除されるため、不要なファイルが残りません。このコードは、ファイルシステムのメタデータの一つであるcTimeの取得と確認方法を具体的に示しています。
getCTime()は、ファイルのパーミッションや所有者、内容など、inodeのメタデータが変更された時刻をUNIXタイムスタンプで返します。これはファイルのデータが最後に更新された時刻(mTime)とは異なるため、混同しないよう注意が必要です。戻り値は整数値のUNIXタイムスタンプのため、date()関数などで人間が読める形式に変換して利用してください。FilesystemIteratorを使用する際は、指定パスが存在しない、またはディレクトリでない場合にUnexpectedValueExceptionが発生することがありますので、try-catchブロックで例外処理を行うことが重要です。また、一時ファイルやディレクトリを作成した場合は、必ずプログラム終了時にそれらをクリーンアップし、不要なリソースがシステムに残らないように管理してください。