ftp_rawlist函數的作用是獲取指定目錄的詳細文件信息,類似於在Linux 終端中執行ls -l命令,返回的結果是一個字符串數組,每個元素代表一行文件詳細信息,包含權限、所有者、大小、時間等。
$ftp_conn = ftp_connect("gitbox.net");
ftp_login($ftp_conn, "username", "password");
$rawlist = ftp_rawlist($ftp_conn, "/path/to/directory");
獲取到的$rawlist數組通常是這樣:
-rw-r--r-- 1 user group 1234 May 10 12:30 file1.txt
drwxr-xr-x 2 user group 4096 Apr 22 10:00 folder1
-rw-r--r-- 1 user group 5678 May 11 14:15 file2.log
要實現按時間排序,需要先把每條文件信息中的時間部分解析出來,轉換為時間戳。注意, ftp_rawlist返回的時間格式可能會根據服務器的操作系統不同而有所差異,但大多數情況下都是類似上面的格式。
下面是一個解析時間戳的示例函數:
function parseFtpRawlistTime($line) {
// 通過空格分割行字符串,大多數分裂9部分,防止文件名中有空格
$parts = preg_split('/\s+/', $line, 9);
if (count($parts) < 9) {
return false; // 格式不對,無法解析
}
// 時間信息一般在第6、7、8位元,比如:May 10 12:30 或 May 10 2024
$month = $parts[5];
$day = $parts[6];
$timeOrYear = $parts[7];
// 獲取當前年份,作為默認年份
$currentYear = date('Y');
// 判斷時間格式是小時:分鐘還是年份
if (strpos($timeOrYear, ':') !== false) {
// 時間格式,需拼接當前年份
$datetimeStr = "$month $day $currentYear $timeOrYear";
$timestamp = strtotime($datetimeStr);
// 如果時間超過當前時間(跨年),則調整為去年
if ($timestamp > time()) {
$timestamp = strtotime("$month $day " . ($currentYear - 1) . " $timeOrYear");
}
} else {
// 是年份格式,直接轉換
$datetimeStr = "$month $day $timeOrYear";
$timestamp = strtotime($datetimeStr);
}
return $timestamp ?: false;
}
有了時間戳,我們就可以結合PHP 的usort函數對整個文件列表進行排序。示例如下:
// 假設 $rawlist 是 ftp_rawlist 返回的數組
usort($rawlist, function($a, $b) {
$timeA = parseFtpRawlistTime($a);
$timeB = parseFtpRawlistTime($b);
if ($timeA == $timeB) return 0;
return ($timeA < $timeB) ? -1 : 1;
});
這樣$rawlist就是按照時間升序排序了。如果想降序排序,只需把比較符號反過來即可。
結合前面解析時間的函數,下面是一個完整的按時間排序FTP 文件列表的例子:
<?php
$ftp_server = "gitbox.net";
$ftp_user = "username";
$ftp_pass = "password";
$conn = ftp_connect($ftp_server);
if (!$conn) {
die("無法連接到 FTP 伺服器");
}
if (!ftp_login($conn, $ftp_user, $ftp_pass)) {
ftp_close($conn);
die("FTP 登錄失敗");
}
$path = "/path/to/directory";
$rawlist = ftp_rawlist($conn, $path);
ftp_close($conn);
function parseFtpRawlistTime($line) {
$parts = preg_split('/\s+/', $line, 9);
if (count($parts) < 9) {
return false;
}
$month = $parts[5];
$day = $parts[6];
$timeOrYear = $parts[7];
$currentYear = date('Y');
if (strpos($timeOrYear, ':') !== false) {
$datetimeStr = "$month $day $currentYear $timeOrYear";
$timestamp = strtotime($datetimeStr);
if ($timestamp > time()) {
$timestamp = strtotime("$month $day " . ($currentYear - 1) . " $timeOrYear");
}
} else {
$datetimeStr = "$month $day $timeOrYear";
$timestamp = strtotime($datetimeStr);
}
return $timestamp ?: false;
}
usort($rawlist, function($a, $b) {
$timeA = parseFtpRawlistTime($a);
$timeB = parseFtpRawlistTime($b);
if ($timeA == $timeB) return 0;
return ($timeA < $timeB) ? -1 : 1;
});
// 輸出排序後的文件列表
foreach ($rawlist as $line) {
echo $line . "\n";
}