當前位置: 首頁> 最新文章列表> 如何從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()的結果中提取出文件大小與修改時間,並將其用於文件同步、日誌分析等場景。