PHP FTP 遞迴目錄列表
P粉621033928
P粉621033928 2023-08-25 00:36:20
0
2
592

我正在嘗試建立一個遞歸函數來從陣列中的 ftp 伺服器取得所有目錄和子目錄。

我嘗試了很多在網路上找到的功能。最適合我的是這個:

public function getAllSubDirFiles() { $dir = array("."); $a = count($dir); $i = 0; $depth = 20; $b = 0; while (($a != $b) && ($i < $depth)) { $i ; $a = count($dir); foreach ($dir as $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 = count($dir); } return $dir ; }

這個函數的問題是它不允許目錄有「.」。在它的名稱中,位於根目錄中的每個檔案也將被視為一個目錄。所以我調整了函數並得到了這個:

public function getAllSubDirFiles($ip, $id, $pw) { $dir = array("."); $a = count($dir); $i = 0; $depth = 20; $b =0; while (($a != $b) && ($i < $depth)) { $i ; $a = count($dir); foreach ($dir as $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 = count($dir); } return $dir ; }

這工作得很好,但給了我想要的結果。但它太慢了,無法使用。

我也嘗試使用ftp_rawlist,但它也有相同的缺點,那就是速度非常慢。

public function getAllSubDirFiles() { $dir = array("."); $a = count($dir); $i = 0; $depth = 20; $b = 0; while (($a != $b) && ($i < $depth)) { $i ; $a = count($dir); foreach ($dir as $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]; } else { $fileName = $fileName . ' ' . $newdir[$key][$a]; } $a ; } if ($firstChar != 'd') { unset($newdir[$key]); } elseif (!in_array($fileName, $dir)) { $dir[] = $fileName; } } } $b = count($dir); } return $dir; } public function getFtp_rawlist($dir) { $newArr = array(); $arr = ftp_rawlist($this->connectionId, $dir); foreach ($arr as $value) { $stringArr = explode(" ", $value); $newArr[] = array_values(array_filter($stringArr)); } return $newArr; }

過去幾天我一直被這個問題困擾,我越來越絕望了。如果有人有任何建議請告訴我

P粉621033928
P粉621033928

全部回覆 (2)
P粉903052556

我建立了一個OOPFTP 用戶端庫,可以幫助您解決此問題很多,僅使用此程式碼,您可以檢索僅包含附加有用資訊的目錄列表,例如(chmod、上次修改時間、大小...)。

程式碼:

// Connection $connection = new FtpConnection("localhost", "foo", "12345"); $connection->open(); // FtpConfig $config = new FtpConfig($connection); $config->setPassive(true); $client = new FtpClient($connection); $allFolders = // directory, recursive, filter $client->listDirectoryDetails('/', true, FtpClient::DIR_TYPE); // Do whatever you want with the folders
    P粉763662390

    如果您的伺服器支援MLSD命令並且您有 PHP 7.2 或更高版本,則可以使用ftp_mlsd函數

    function ftp_mlsd_recursive($ftp_stream, $directory) { $result = []; $files = ftp_mlsd($ftp_stream, $directory); if ($files === false) { die("Cannot list $directory"); } foreach ($files as $file) { $name = $file["name"]; $filepath = $directory . "/" . $name; if (($file["type"] == "cdir") || ($file["type"] == "pdir")) { // noop } else if ($file["type"] == "dir") { $result = array_merge($result, ftp_mlsd_recursive($ftp_stream, $filepath)); } else { $result[] = $filepath; } } return $result; }

    如果您沒有 PHP 7.2,您可以嘗試自行實作MLSD指令。首先,請參閱ftp_rawlist指令的使用者註解:
    https://www.php.net/manual/en/ function.ftp-rawlist.php#101071


    #如果您無法使用MLSD,那麼您在判斷條目是檔案還是資料夾時尤其會遇到問題。雖然您可以使用ftp_size技巧,但呼叫每個條目的ftp_size可能需要很長時間。

    但是,如果您只需要針對一個特定的 FTP 伺服器進行工作,則可以使用ftp_rawlist以特定於平台的格式檢索檔案清單並對其進行解析。

    以下程式碼假定採用常見的 *nix 格式。

    function ftp_nlst_recursive($ftp_stream, $directory) { $result = []; $lines = ftp_rawlist($ftp_stream, $directory); if ($lines === false) { die("Cannot list $directory"); } foreach ($lines as $line) { $tokens = preg_split("/\s+/", $line, 9); $name = $tokens[8]; $type = $tokens[0][0]; $filepath = $directory . "/" . $name; if ($type == 'd') { $result = array_merge($result, ftp_nlst_recursive($ftp_stream, $filepath)); } else { $result[] = $filepath; } } return $result; }

    對於 DOS 格式,請參閱:使用 PHP 從 FTP 取得目錄結構

      最新下載
      更多>
      網站特效
      網站源碼
      網站素材
      前端模板
      關於我們 免責聲明 Sitemap
      PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!