當前位置: 首頁> 最新文章列表> ftp_rawlist 獲取遞歸目錄結構的方法

ftp_rawlist 獲取遞歸目錄結構的方法

gitbox 2025-05-26

在使用PHP 操作FTP 的過程中,我們經常會遇到需要獲取遠程服務器上某個目錄及其所有子目錄和文件的情況。 PHP 的FTP 擴展中雖然提供了ftp_nlistftp_rawlist等方法,但它們默認只列出當前目錄的內容。如果想要遞歸地獲取完整的目錄結構,就需要我們手動實現邏輯處理。本文將通過完整示例詳細解析如何使用ftp_rawlist實現FTP 上的目錄結構遞歸獲取。

基礎知識回顧: ftp_rawlist

ftp_rawlist是PHP 中的一個函數,用於獲取FTP 服務器上指定目錄的詳細文件列表,它的返回結果類似於UNIX 的ls -l命令輸出的格式。例如:

 Array
(
    [0] => drwxr-xr-x   2 ftp      ftp          4096 Jan 01 12:00 folder
    [1] => -rw-r--r--   1 ftp      ftp          1234 Jan 01 12:01 file.txt
)

我們可以從這些信息中解析出文件類型(目錄或文件)、名稱、大小、修改時間等信息。

實現思路

要實現遞歸獲取目錄結構,我們需要:

  1. 使用ftp_rawlist獲取當前目錄下的所有條目;

  2. 解析每一條的返回內容,識別出是目錄還是文件;

  3. 如果是目錄(並且不是... ),則遞歸進入該目錄;

  4. 將目錄結構構建為樹形數組,便於後續處理或展示。

完整示例代碼

以下是一個可用的PHP 示例,演示如何實現:

 <?php

function getRecursiveFtpList($ftpConn, $path)
{
    $structure = [];
    $rawList = ftp_rawlist($ftpConn, $path);

    if ($rawList === false) {
        return $structure;
    }

    foreach ($rawList as $line) {
        $parts = preg_split("/\s+/", $line, 9);
        if (count($parts) < 9) continue;

        $name = $parts[8];
        $type = $parts[0][0];
        $fullPath = $path . '/' . $name;

        if ($type === 'd') {
            if ($name === '.' || $name === '..') continue;
            $structure[] = [
                'type' => 'directory',
                'name' => $name,
                'path' => $fullPath,
                'children' => getRecursiveFtpList($ftpConn, $fullPath),
            ];
        } elseif ($type === '-') {
            $structure[] = [
                'type' => 'file',
                'name' => $name,
                'path' => $fullPath,
                'size' => (int)$parts[4],
            ];
        }
    }

    return $structure;
}

// 示例用法:
$ftpHost = 'ftp.gitbox.net';
$ftpUser = 'your_username';
$ftpPass = 'your_password';

$conn = ftp_connect($ftpHost);
if (!$conn) {
    die("無法連接到 FTP 伺服器");
}

if (!ftp_login($conn, $ftpUser, $ftpPass)) {
    ftp_close($conn);
    die("FTP 登錄失敗");
}

// 可選:設置被動模式
ftp_pasv($conn, true);

$directoryTree = getRecursiveFtpList($conn, '/');

ftp_close($conn);

// 打印結構(調試用)
echo "<pre>";
print_r($directoryTree);
echo "</pre>";

輸出結構示例

運行上述代碼後,你將得到如下類似的輸出:

 Array
(
    [0] => Array
        (
            [type] => directory
            [name] => public_html
            [path] => /public_html
            [children] => Array
                (
                    [0] => Array
                        (
                            [type] => file
                            [name] => index.php
                            [path] => /public_html/index.php
                            [size] => 1234
                        )
                    ...
                )
        )
    [1] => Array
        (
            [type] => file
            [name] => readme.txt
            [path] => /readme.txt
            [size] => 456
        )
)

注意事項

  1. 編碼問題:某些FTP 服務器返回的目錄或文件名可能包含非UTF-8 字符,需進行轉碼處理;

  2. 性能問題:遞歸操作在大目錄結構下可能較慢,適當使用緩存或分頁策略;

  3. 權限限制:確保FTP 用戶對遞歸目錄具有讀取權限,否則可能無法列出所有內容;

  4. 被動模式:有些FTP 服務需要開啟被動模式,使用ftp_pasv($conn, true);設置。

總結

通過ftp_rawlist配合遞歸處理,我們可以在PHP 中完整獲取FTP 服務器上的目錄結構。這種方法靈活性高,可以按需定制數據結構,對於自動化部署、備份同步、文件瀏覽等應用場景非常有用。

希望本文的完整示例能幫助你掌握這項技巧,並將其應用到實際開發中。