Penyenaraian direktori rekursif PHP FTP
P粉621033928
P粉621033928 2023-08-25 00:36:20
0
2
558

Saya cuba mencipta fungsi rekursif untuk mendapatkan semua direktori dan subdirektori daripada pelayan ftp dalam tatasusunan.

Saya mencuba banyak ciri yang saya temui dalam talian. Yang paling sesuai untuk saya ialah ini:

fungsi awam getAllSubDirFiles() { $dir = array("."); $a = count($dir); $i = 0; $depth = 20; $b = 0; manakala (($a != $b) && ($i < $depth)) { $i++; $a = count($dir); foreach ($dir sebagai $d) { $ftp_dir = $d . $newdir = ftp_nlist($this->connectionId, $ftp_dir); foreach ($newdir sebagai $key => $x) { jika ((strpos($x, ".")) || (strpos($x, ".") === 0)) { unset($newdir[$key]); } elseif (!in_array($x, $dir)) { $dir[] = $x; } } } $b = kiraan($dir); } pulangkan $dir; }

Masalah dengan fungsi ini ialah ia tidak membenarkan direktori mempunyai "."Setiap fail yang terletak dalam direktori akar juga akan dianggap sebagai direktori dalam namanya. Jadi saya tweak fungsi dan mendapat ini:

fungsi awam getAllSubDirFiles($ip, $id, $pw) { $dir = array("."); $a = count($dir); $i = 0; $depth = 20; $b =0; manakala (($a != $b) && ($i < $depth)) { $i++; $a = count($dir); foreach ($dir sebagai $d) { $ftp_dir = $d . $newdir = ftp_nlist($this->connectionId, $ftp_dir); foreach ($newdir sebagai $key => $x) { jika (!is_dir('ftp://'.$id.':'.$pw.'@'.$ip.'/'.$x)) { unset($newdir[$key]); } elseif (!in_array($x, $dir)) { $dir[] = $x; } } } $b = kiraan($dir); } pulangkan $dir; }

Ini berfungsi dengan baik tetapi memberikan hasil yang saya inginkan. Tetapi ia terlalu lambat untuk digunakan.

Saya juga cuba menggunakan ftp_rawlist tetapi ia mempunyai kelemahan yang sama iaitu sangat lambat.

fungsi awam getAllSubDirFiles() { $dir = array("."); $a = count($dir); $i = 0; $depth = 20; $b = 0; manakala (($a != $b) && ($i < $depth)) { $i++; $a = count($dir); foreach ($dir sebagai $d) { $ftp_dir = $d . $newdir = $this->getFtp_rawlist('/' . $ftp_dir); foreach ($newdir sebagai $key => $x) { $firstChar = substr($newdir[$key][0], 0, 1); $a = 8; manakala ($a < count($newdir[$key])) { jika ($a == 8) { $fileName = $ftp_dir '/' . } lain { $fileName = $fileName . } $a++; } jika ($firstChar != 'd') { unset($newdir[$key]); } elseif (!in_array($fileName, $dir)) { $dir[] = $fileName; } } } $b = kiraan($dir); } pulangkan $dir; } fungsi awam getFtp_rawlist($dir) { $newArr = array(); $arr = ftp_rawlist($this->connectionId, $dir); foreach ($arr sebagai $value) { $stringArr = explode(" ", $value); $newArr[] = array_values(array_filter($stringArr)); } pulangkan $newArr; }

Saya telah bermasalah dengan masalah ini sejak beberapa hari lalu, dan saya semakin terdesak. Jika sesiapa mempunyai sebarang cadangan sila beritahu saya

P粉621033928
P粉621033928

membalas semua (2)
P粉903052556

Saya membina OOPFTP client libraryyang boleh membantu anda menyelesaikan masalah ini dengan banyak, hanya menggunakan kod ini anda boleh mendapatkan senarai direktori dengan hanya maklumat berguna tambahan seperti (chmod, masa diubah suai terakhir, saiz... .).

Kod:

// 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

    Jika pelayan anda menyokong fungsiMLSD命令并且您有 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; }

    Jika anda tidak mempunyai PHP 7.2, anda boleh cuba melaksanakannya sendiriMLSD命令。首先,请参阅ftp_rawlistNota pengguna untuk arahan:
    https://www.php.net/manual/en/ function.ftp-rawlist.php#101071


    Jika anda tidak mempunyai akses kepadaMLSD, anda akan menghadapi masalah untuk mengetahui sama adaentri adalah fail atau folderMLSD,那么您在判断条目是文件还是文件夹时尤其会遇到问题。虽然您可以使用ftp_size技巧,但调用每个条目的ftp_size. Walaupun anda boleh menggunakan helahftp_size, memanggilftp_sizesetiap entri boleh mengambil masa yang lama.

    Walau bagaimanapun, jika anda hanya perlu bekerja dengan satu pelayan FTP tertentu, anda boleh menggunakanftp_rawlistuntuk mendapatkan semula senarai fail dalam format khusus platform dan menghuraikannya.

    Kod berikut menganggap format *nix biasa.

    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; }

    Untuk format DOS, lihat:Dapatkan struktur direktori daripada FTP menggunakan PHP.

      Muat turun terkini
      Lagi>
      kesan web
      Kod sumber laman web
      Bahan laman web
      Templat hujung hadapan
      Tentang kita Penafian Sitemap
      Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!