PHP FTP 재귀 디렉터리 목록
P粉621033928
P粉621033928 2023-08-25 00:36:20
0
2
710
<p>FTP 서버의 모든 디렉터리와 하위 디렉터리를 배열로 가져오는 재귀 함수를 만들려고 합니다. </p> <p>온라인에서 찾은 많은 기능을 사용해 보았습니다. 나에게 가장 적합한 것은 다음과 같습니다. </p> <pre class="brush:php;toolbar:false;">공용 함수 getAllSubDirFiles() { $dir = 배열("."); $a = 개수($dir); $i = 0; $깊이 = 20; $b = 0; while (($a != $b) && ($i < $깊이)) { $i++; $a = 개수($dir); foreach ($dir을 $d로) { $ftp_dir = $d "/"; $newdir = ftp_nlist($this->connectionId, $ftp_dir); foreach ($newdir as $key => $x) { if ((strpos($x, ".")) || (strpos($x, ".") === 0)) { unset($newdir[$key]); } elseif (!in_array($x, $dir)) { $dir[] = $x; } } } $b = 개수($dir); } $dir을 반환합니다. }</pre> <p>이 기능의 문제점은 디렉토리에 "."이 있는 것을 허용하지 않는다는 것입니다.루트 디렉터리에 있는 모든 파일은 이름에서도 디렉터리로 간주됩니다. 그래서 저는 함수를 조정하여 다음과 같은 결과를 얻었습니다. </p> <pre class="brush:php;toolbar:false;">공용 함수 getAllSubDirFiles($ip, $id, $pw) { $dir = 배열("."); $a = 개수($dir); $i = 0; $깊이 = 20; $b =0; while (($a != $b) && ($i < $깊이)) { $i++; $a = 개수($dir); foreach ($dir을 $d로) { $ftp_dir = $d "/"; $newdir = ftp_nlist($this->connectionId, $ftp_dir); foreach ($newdir as $key => $x) { if (!is_dir('ftp://'.$id.':'.$pw.'@'.$ip.'/'.$x)) { unset($newdir[$key]); } elseif (!in_array($x, $dir)) { $dir[] = $x; } } } $b = 개수($dir); } $dir을 반환합니다. }</pre> <p>이 방법은 제대로 작동하지만 원하는 결과를 제공합니다. 하지만 사용하기에는 너무 느립니다. </p> <p>나도 <code>ftp_rawlist</code>를 사용해 보았지만 속도가 매우 느리다는 단점이 있었습니다. </p> <pre class="brush:php;toolbar:false;">공용 함수 getAllSubDirFiles() { $dir = 배열("."); $a = 개수($dir); $i = 0; $깊이 = 20; $b = 0; while (($a != $b) && ($i < $깊이)) { $i++; $a = 개수($dir); foreach ($dir을 $d로) { $ftp_dir = $d "/"; $newdir = $this->getFtp_rawlist('/' . $ftp_dir); foreach ($newdir as $key => $x) { $firstChar = substr($newdir[$key][0], 0, 1); $a = 8; while ($a < count($newdir[$key])) { if ($a == 8) { $fileName = $ftp_dir . $newdir[$key][$a]; } 또 다른 { $fileName = $fileName . $newdir[$key][$a]; } $a++; } if ($firstChar != 'd') { unset($newdir[$key]); } elseif (!in_array($fileName, $dir)) { $dir[] = $파일이름; } } } $b = 개수($dir); } $dir을 반환합니다. } 공개 함수 getFtp_rawlist($dir) { $newArr = 배열(); $arr = ftp_rawlist($this->connectionId, $dir); foreach($arr를 $value로) { $stringArr = 폭발(" ", $value); $newArr[] = array_values(array_filter($stringArr)); } $newArr 반환; }</pre> <p>저는 지난 며칠 동안 이 문제로 고민을 했고, 점점 더 절박해지고 있습니다. 누구든지 제안 사항이 있으면 알려주시기 바랍니다</p>
P粉621033928
P粉621033928

모든 응답(2)
P粉903052556

저는 이 문제를 해결하는 데 많은 도움이 될 수 있는 OOP FTP 클라이언트 라이브러리를 구축했습니다. 이 코드를 사용하면 (chmod, 마지막 수정 시간, 크기....)와 같은 추가 유용한 정보만 포함된 디렉터리 목록을 검색할 수 있습니다.

코드:

으아아아
P粉763662390

서버가 MLSD 命令并且您有 PHP 7.2 或更高版本,则可以使用 ftp_mlsd 기능 을 지원하는 경우:

으아아아

PHP 7.2가 없다면 직접 구현해볼 수 있습니다. MLSD 命令。首先,请参阅 ftp_rawlist 명령에 대한 사용자 참고 사항:
https://www.php.net/manual/en/ function.ftp-rawlist.php#101071


MLSD에 액세스할 수 없는 경우 특히 항목이 파일이나 폴더 MLSD,那么您在判断条目是文件还是文件夹时尤其会遇到问题。虽然您可以使用 ftp_size 技巧,但调用 每个条目的 ftp_size. ftp_size 트릭을 사용할 수 있지만 를 호출하면 됩니다. 항목당 ftp_size는 시간이 오래 걸릴 수 있습니다.

그러나 하나의 특정 FTP 서버에 대해서만 작업해야 하는 경우 ftp_rawlist를 사용하여 플랫폼별 형식의 파일 목록을 검색하고 구문 분석할 수 있습니다.

다음 코드는 일반적인 *nix 형식을 가정합니다.

으아아아

DOS 형식의 경우 PHP를 사용하여 FTP에서 디렉토리 구조 가져오기를 참조하세요.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿