Rumah > Soal Jawab > teks badan
P粉9030525562023-08-25 17:19:00
Saya membina OOP FTP client library yang 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粉7636623902023-08-25 11:29:06
Jika pelayan anda menyokong fungsi 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; }
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 ada entri adalah fail atau folder MLSD
,那么您在判断条目是文件还是文件夹时尤其会遇到问题。虽然您可以使用 ftp_size
技巧,但调用 每个条目的 ftp_size
. Walaupun anda boleh menggunakan helah ftp_size
, memanggil ftp_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.
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.