ホームページ  >  に質問  >  本文

PHP FTP 再帰ディレクトリリスト

<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>
P粉621033928P粉621033928394日前600

全員に返信(2)返信します

  • P粉903052556

    P粉9030525562023-08-25 17:19:00

    私は、この問題の解決に大いに役立つ OOP FTP クライアント ライブラリ を構築しました。このコードだけを使用すると、(chmod、最終変更時刻、サイズなどの追加の有用な情報を含む) ディレクトリ リストを取得できます。 ...)。

    コード:

    リーリー

    返事
    0
  • P粉763662390

    P粉7636623902023-08-25 11:29:06

    サーバーが 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 を呼び出すと時間がかかる可能性があります。

    ただし、特定の 1 つの FTP サーバーに対してのみ作業する必要がある場合は、

    ftp_rawlist を使用して、プラットフォーム固有の形式でファイルのリストを取得し、それを解析できます。

    次のコードは、一般的な *nix 形式を想定しています。

    リーリー

    DOS 形式については、「

    PHP を使用して FTP からディレクトリ構造を取得する」を参照してください。

    返事
    0
  • キャンセル返事