PHP FTP 再帰ディレクトリリスト
P粉621033928
2023-08-25 00:36:20
<p>配列内の FTP サーバーからすべてのディレクトリとサブディレクトリを取得する再帰関数を作成しようとしています。 </p>
<p>オンラインで見つけた多くの機能を試しました。私にとって最も効果的なのはこれです: </p>
<pre class="brush:php;toolbar:false;">public function getAllSubDirFiles() {
$dir = 配列(".");
$a = カウント($dir);
$i = 0;
$深さ = 20;
$b = 0;
while (($a != $b) && ($i < $ Depth)) {
$i;
$a = カウント($dir);
foreach ($dir として $d) {
$ftp_dir = $d . "/";
$newdir = ftp_nlist($this->接続ID, $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;">public function getAllSubDirFiles($ip, $id, $pw) {
$dir = 配列(".");
$a = カウント($dir);
$i = 0;
$深さ = 20;
$b =0;
while (($a != $b) && ($i < $ Depth)) {
$i;
$a = カウント($dir);
foreach ($dir として $d) {
$ftp_dir = $d . "/";
$newdir = ftp_nlist($this->接続ID, $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;">public function getAllSubDirFiles() {
$dir = 配列(".");
$a = カウント($dir);
$i = 0;
$深さ = 20;
$b = 0;
while (($a != $b) && ($i < $ Depth)) {
$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 as $value) {
$stringArr =explode(" ", $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
を使用できない場合、 エントリがファイルであるかフォルダー であるかを判断するのに特に問題が発生します。ftp_size
トリックを使用することはできますが、エントリごとに ftp_sizeを呼び出すと時間がかかる可能性があります。
ftp_rawlist
次のコードは、一般的な *nix 形式を想定しています。を使用して、プラットフォーム固有の形式でファイルのリストを取得し、それを解析できます。
リーリー
DOS 形式については、「PHP を使用して FTP からディレクトリ構造を取得する」を参照してください。