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
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:
Jika pelayan anda menyokong fungsi
MLSD
命令并且您有 PHP 7.2 或更高版本,则可以使用ftp_mlsd
:Jika anda tidak mempunyai PHP 7.2, anda boleh cuba melaksanakannya sendiri
MLSD
命令。首先,请参阅ftp_rawlist
Nota pengguna untuk arahan:https://www.php.net/manual/en/ function.ftp-rawlist.php#101071
Jika anda tidak mempunyai akses kepada
MLSD
, anda akan menghadapi masalah untuk mengetahui sama adaentri adalah fail atau folderMLSD
,那么您在判断条目是文件还是文件夹时尤其会遇到问题。虽然您可以使用ftp_size
技巧,但调用每个条目的ftp_size
. Walaupun anda boleh menggunakan helahftp_size
, memanggilftp_size
setiap entri boleh mengambil masa yang lama.Walau bagaimanapun, jika anda hanya perlu bekerja dengan satu pelayan FTP tertentu, anda boleh menggunakan
ftp_rawlist
untuk mendapatkan semula senarai fail dalam format khusus platform dan menghuraikannya.Kod berikut menganggap format *nix biasa.
Untuk format DOS, lihat:Dapatkan struktur direktori daripada FTP menggunakan PHP.