在使用PHP 通過FTP 協議操作遠程服務器時, ftp_rawlist()是一個常用函數,它可以返回類似於Unix 系統ls -l命令的輸出結果。儘管這些原始輸出提供了完整的文件列表信息,但由於其格式為純文本字符串,要從中提取出如文件大小、修改時間這樣的具體信息,則需要一些額外處理。
本文將介紹如何通過解析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()的結果中提取出文件大小與修改時間,並將其用於文件同步、日誌分析等場景。