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
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
命令。首先,請(qǐng)參閱 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
,那么您在判斷條目是文件還是文件夾時(shí)尤其會(huì)遇到問(wèn)題。雖然您可以使用 ftp_size
技巧,但調(diào)用 每個(gè)條目的 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.