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";
}