Maison > Questions et réponses > le corps du texte
P粉9030525562023-08-25 17:19:00
J'ai construit une bibliothèque client FTP POO qui peut beaucoup vous aider à résoudre ce problème, en utilisant simplement ce code, vous pouvez récupérer une liste de répertoires avec uniquement des informations utiles supplémentaires comme (chmod, heure de la dernière modification, taille... .).
Code :
// 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
Si votre serveur prend en charge la fonction 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; }
Si vous n'avez pas PHP 7.2, vous pouvez essayer de l'implémenter vous-même MLSD
命令。首先,请参阅 ftp_rawlist
Notes d'utilisateur pour la commande :
https://www.php.net/manual/en/ function.ftp-rawlist.php#101071
Si vous n'avez pas accès à MLSD
, vous aurez surtout du mal à déterminer si une entrée est un fichier ou un dossier MLSD
,那么您在判断条目是文件还是文件夹时尤其会遇到问题。虽然您可以使用 ftp_size
技巧,但调用 每个条目的 ftp_size
. Bien que vous puissiez utiliser l'astuce ftp_size
, en appelant ftp_size
par entrée peut prendre beaucoup de temps.
Cependant, si vous n'avez besoin de travailler que sur un serveur FTP spécifique, vous pouvez utiliser ftp_rawlist
pour récupérer une liste de fichiers dans un format spécifique à la plate-forme et les analyser.
Le code suivant suppose le format * nix commun.
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; }
Pour le format DOS, voir : Obtenir la structure des répertoires à partir de FTP en utilisant PHP.