当前位置: 首页> 最新文章列表> ftp_rawlist 实现按时间排序文件列表的方法

ftp_rawlist 实现按时间排序文件列表的方法

gitbox 2025-05-26

1. ftp_rawlist 函数简介

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

2. 分析时间信息,提取时间戳

要实现按时间排序,需要先把每条文件信息中的时间部分解析出来,转换为时间戳。注意,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;
}

3. 对文件列表按时间排序

有了时间戳,我们就可以结合 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 就是按照时间升序排序了。如果想降序排序,只需把比较符号反过来即可。

4. 完整示例代码

结合前面解析时间的函数,下面是一个完整的按时间排序 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";
}