[PHP]filectime関数の完全ガイド – ファイルの作成時刻を取得する方法

PHP

こんにちは!今回はPHPのfilectime関数について、基本から実践的な使い方まで詳しく解説します。

1. 基本的な使い方

// ファイルの作成時刻を取得
$filename = 'example.txt';
$createTime = filectime($filename);

// 読みやすい形式に変換
echo date('Y-m-d H:i:s', $createTime);

2. 実践的な使用例

2-1. ファイル情報の包括的な取得

function getDetailedFileInfo($filename) {
    if (!file_exists($filename)) {
        throw new Exception("ファイル '{$filename}' が存在しません");
    }

    return [
        'name' => basename($filename),
        'create_time' => filectime($filename),
        'modify_time' => filemtime($filename),
        'access_time' => fileatime($filename),
        'size' => filesize($filename),
        'type' => filetype($filename),
        'readable' => is_readable($filename),
        'writable' => is_writable($filename)
    ];
}

// 使用例
try {
    $info = getDetailedFileInfo('document.txt');
    foreach ($info as $key => $value) {
        if (in_array($key, ['create_time', 'modify_time', 'access_time'])) {
            echo "{$key}: " . date('Y-m-d H:i:s', $value) . "\n";
        } else {
            echo "{$key}: {$value}\n";
        }
    }
} catch (Exception $e) {
    echo "エラー: " . $e->getMessage();
}

2-2. 最近作成されたファイルの検索

function findRecentFiles($directory, $hours = 24) {
    $recentFiles = [];
    $currentTime = time();
    $threshold = $currentTime - ($hours * 3600);

    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($directory)
    );

    foreach ($files as $file) {
        if ($file->isFile()) {
            $createTime = filectime($file->getPathname());
            if ($createTime > $threshold) {
                $recentFiles[] = [
                    'path' => $file->getPathname(),
                    'created' => date('Y-m-d H:i:s', $createTime),
                    'hours_ago' => floor(($currentTime - $createTime) / 3600)
                ];
            }
        }
    }

    return $recentFiles;
}

2-3. ファイルの経過時間監視

class FileAgeMonitor {
    private $maxAge;

    public function __construct($maxAgeHours = 24) {
        $this->maxAge = $maxAgeHours * 3600;
    }

    public function checkFile($filename) {
        if (!file_exists($filename)) {
            throw new Exception("ファイルが存在しません");
        }

        $createTime = filectime($filename);
        $age = time() - $createTime;

        return [
            'file' => $filename,
            'age_hours' => floor($age / 3600),
            'is_old' => $age > $this->maxAge,
            'created_at' => date('Y-m-d H:i:s', $createTime)
        ];
    }

    public function monitorDirectory($directory) {
        $results = [];
        $files = glob($directory . '/*');

        foreach ($files as $file) {
            try {
                $results[] = $this->checkFile($file);
            } catch (Exception $e) {
                error_log($e->getMessage());
            }
        }

        return $results;
    }
}

3. エラーハンドリング

function safeGetCreateTime($filename) {
    try {
        if (!file_exists($filename)) {
            throw new Exception("ファイルが存在しません");
        }

        if (!is_readable($filename)) {
            throw new Exception("ファイルを読み取れません");
        }

        $createTime = filectime($filename);
        if ($createTime === false) {
            throw new Exception("作成時刻の取得に失敗しました");
        }

        clearstatcache(true, $filename);

        return [
            'timestamp' => $createTime,
            'formatted' => date('Y-m-d H:i:s', $createTime)
        ];

    } catch (Exception $e) {
        error_log("Error in safeGetCreateTime: " . $e->getMessage());
        return false;
    }
}

4. タイムゾーンの考慮

function getFileTimesWithTZ($filename, $timezone = 'Asia/Tokyo') {
    // 現在のタイムゾーンを保存
    $originalTZ = date_default_timezone_get();

    try {
        // 指定されたタイムゾーンに設定
        date_default_timezone_set($timezone);

        $createTime = filectime($filename);

        $result = [
            'create_time' => [
                'timestamp' => $createTime,
                'formatted' => date('Y-m-d H:i:s', $createTime),
                'timezone' => $timezone
            ]
        ];

        // 元のタイムゾーンに戻す
        date_default_timezone_set($originalTZ);

        return $result;

    } catch (Exception $e) {
        // エラーが発生した場合も元のタイムゾーンに戻す
        date_default_timezone_set($originalTZ);
        throw $e;
    }
}

注意点

  1. filectimeはファイルの作成時刻ではなく、iノードの最終変更時刻を返すことがあります。
  2. キャッシュの影響を受けるため、最新の情報を得るにはclearstatcache()を使用します。
  3. タイムゾーンの設定が結果に影響を与えます。
  4. パーミッションの問題でアクセスできない場合、falseが返されます。

まとめ

filectime関数を使用する際は、以下の点に注意しましょう:

  1. 適切なエラーハンドリングの実装
  2. タイムゾーンの考慮
  3. キャッシュのクリア
  4. パーミッションの確認
  5. 返値の適切な解釈

これらの点を意識することで、より信頼性の高いファイル時刻管理が可能になります。

タイトルとURLをコピーしました