當前位置: 首頁> 最新文章列表> 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";
}