PHP FTP 재귀 디렉터리 목록
<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>