현재 위치: > 최신 기사 목록> 재귀 디렉토리 구조를 얻는 ftp_rawlist 방법

재귀 디렉토리 구조를 얻는 ftp_rawlist 방법

gitbox 2025-05-26

PHP를 사용하여 FTP를 작동하는 과정에서, 우리는 종종 디렉토리와 원격 서버에서 모든 하위 디렉토리 및 파일을 얻어야하는 상황을 만나게됩니다. FTP_NLISTFTP_RAWLIST 와 같은 방법이 PHP의 FTP 확장에 제공되지만 기본적으로 현재 디렉토리의 내용 만 나열합니다. 완전한 디렉토리 구조를 재귀 적으로 얻으려면 논리적 처리를 수동으로 구현해야합니다. 이 기사는 전체 예제를 사용하여 FTP_Rawlist를 사용하여 FTP에서 디렉토리 구조의 재귀 적 획득을 구현하는 방법을 자세히 분석합니다.

기본 지식 검토 : FTP_RAWLIST

FTP_RAWLIST는 FTP 서버에서 지정된 디렉토리의 상세한 파일 목록을 얻는 PHP의 함수입니다. 반환 결과는 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 서버에서 디렉토리 구조를 완전히 얻을 수 있습니다. 이 방법은 매우 유연하며 주문시 데이터 구조를 사용자 정의 할 수 있으며, 이는 자동 배포, 백업 동기화, 파일 브라우징 등과 같은 응용 프로그램 시나리오에 매우 유용합니다.

이 기사의 완전한 예가이 기술을 마스터하고 실제 개발에 적용하는 데 도움이되기를 바랍니다.