現在の位置: ホーム> 最新記事一覧> FTP_RAWLISTの結果からファイルのサイズと変更時間を抽出する方法は?

FTP_RAWLISTの結果からファイルのサイズと変更時間を抽出する方法は?

gitbox 2025-05-26

PHPを使用してFTPプロトコルを介してリモートサーバーを操作する場合、 FTP_RAWLIST()は、UNIXシステムのLS -Lコマンドと同様に出力を返すことができる一般的な関数です。これらの生の出力は完全なファイルリスト情報を提供しますが、その形式はプレーンテキスト文字列であるため、ファイルサイズや変更時間などの特定の情報を抽出するには追加の処理が必要です。

この記事では、 ftp_rawlist()の出力を解析することにより、各ファイルのサイズと最後の変更時間を抽出する方法を紹介し、サンプルコードが付属しています。

FTP_RAWLISTの出力形式を理解します

ftp_rawlist()文字列の配列を返します。各要素は、次のように形式のファイルまたはディレクトリに関する情報を表します。

 -rw-r--r--   1 user group     1048576 May 21 13:37 filename.zip
drwxr-xr-x   2 user group         512 May 20 10:15 subdir

各行は、ファイルタイプ、アクセス許可、リンク数、所有者、グループ、サイズ、変更の日付と時刻、ファイル名を含むスペース分離文字列です。

正規表現を使用してコンテンツを解析します

ファイルのサイズと変更時間を抽出するには、これらのフィールドを正規表現で解析できます。

 <?php
// 接続する FTP
$ftp = ftp_connect("gitbox.net");
ftp_login($ftp, "username", "password");

// ディレクトリリストを取得します
$rawList = ftp_rawlist($ftp, ".");

// 各ラインを反復して解析します
foreach ($rawList as $line) {
    if (preg_match('/^([\-ld])([rwx\-]{9})\s+\d+\s+\S+\s+\S+\s+(\d+)\s+([A-Za-z]{3})\s+(\d{1,2})\s+(\d{2}:\d{2}|\d{4})\s+(.*)$/', $line, $matches)) {
        $type = $matches[1];
        $size = $matches[3];
        $month = $matches[4];
        $day = $matches[5];
        $timeOrYear = $matches[6];
        $name = $matches[7];

        // 変更された時間をタイムスタンプに変換します
        $currentYear = date("Y");
        $fileTimeStr = "$month $day $timeOrYear";

        if (strpos($timeOrYear, ':') !== false) {
            // それは時刻を意味します,年は今年です
            $fileTimeStr .= " $currentYear";
            $timestamp = strtotime($fileTimeStr);
        } else {
            // 時間は年です
            $timestamp = strtotime("$month $day $timeOrYear");
        }

        echo "書類: $name\n";
        echo "タイプ: " . ($type === 'd' ? '目次' : '書類') . "\n";
        echo "サイズ: $size バイト\n";
        echo "変更時間: " . date("Y-m-d H:i:s", $timestamp) . "\n";
        echo "-----------------------------\n";
    }
}
ftp_close($ftp);
?>

注意すべきこと

  • FTP_RAWLIST()の形式は、リモートサーバーのオペレーティングシステムタイプに依存し、上記のルールはUNIXスタイルのリストの結果を対象としています。サーバーがWindows FTPを使用する場合、出力形式は完全に異なり、実際の状況に応じて調整する必要があります。

  • 一貫性のない形式によって引き起こされる問題を防ぐために、解析プロセス中に常に定期的なマッチングエラー処理を実行することをお勧めします。

  • タイムゾーンを越えたサーバーの場合、 strtotime()変換の結果にエラーがある場合があります。 DateTimeクラスおよびタイムゾーンオブジェクトを使用して、時間をより正確に処理することをお勧めします。

上記の方法を使用して、 FTP_RAWLIST()の結果からファイルサイズと変更時間を簡単に抽出し、ファイルの同期、ログ分析、その他のシナリオに使用できます。