PHP FTP 재귀 디렉터리 목록
P粉621033928
2023-08-25 00:36:20
<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>
저는 이 문제를 해결하는 데 많은 도움이 될 수 있는 OOP FTP 클라이언트 라이브러리를 구축했습니다. 이 코드를 사용하면 (chmod, 마지막 수정 시간, 크기....)와 같은 추가 유용한 정보만 포함된 디렉터리 목록을 검색할 수 있습니다.
코드:
으아아아서버가
으아아아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에서 디렉토리 구조 가져오기를 참조하세요.