Liste des répertoires récursifs PHP FTP
P粉621033928
2023-08-25 00:36:20
<p>J'essaie de créer une fonction récursive pour obtenir tous les répertoires et sous-répertoires d'un serveur FTP dans un tableau. </p>
<p>J'ai essayé de nombreuses fonctionnalités trouvées en ligne. Celui qui me convient le mieux est celui-ci : </p>
<pre class="brush:php;toolbar:false;">public function getAllSubDirFiles() {
$dir = tableau(".");
$a = compte($dir);
$je = 0 ;
$profondeur = 20 ;
$b = 0 ;
while (($a != $b) && ($i < $profondeur)) {
$i++;
$a = compte($dir);
foreach ($dir comme $d) {
$ftp_dir = $d .
$newdir = ftp_nlist($this->connectionId, $ftp_dir);
foreach ($newdir as $key => $x) {
if ((strpos($x, ".")) || (strpos($x, ".") === 0)) {
unset($nouveaurép[$clé]);
} elseif (!in_array($x, $dir)) {
$dir[] = $x;
}
}
}
$b = compte ($dir);
}
retourner $rép;
}</pré>
<p>Le problème avec cette fonction est qu'elle ne permet pas aux répertoires d'avoir "."Chaque fichier situé dans le répertoire racine sera également considéré comme un répertoire en son nom. J'ai donc modifié la fonction et j'ai obtenu ceci : </p>
<pre class="brush:php;toolbar:false;">fonction publique getAllSubDirFiles($ip, $id, $pw) {
$dir = tableau(".");
$a = compte($dir);
$je = 0 ;
$profondeur = 20 ;
$b =0 ;
while (($a != $b) && ($i < $profondeur)) {
$i++;
$a = compte($dir);
foreach ($dir comme $d) {
$ftp_dir = $d .
$newdir = ftp_nlist($this->connectionId, $ftp_dir);
foreach ($newdir as $key => $x) {
if (!is_dir('ftp://'.$id.':'.$pw.'@'.$ip.'/'.$x)) {
unset($nouveaurép[$clé]);
} elseif (!in_array($x, $dir)) {
$dir[] = $x;
}
}
}
$b = compte ($dir);
}
retourner $rép;
}</pré>
<p>Cela fonctionne bien mais donne les résultats souhaités. Mais c'est trop lent à utiliser. </p>
<p>J'ai également essayé d'utiliser <code>ftp_rawlist</code> mais cela présentait le même inconvénient d'être très lent. </p>
<pre class="brush:php;toolbar:false;">public function getAllSubDirFiles() {
$dir = tableau(".");
$a = compte($dir);
$je = 0 ;
$profondeur = 20 ;
$b = 0 ;
while (($a != $b) && ($i < $profondeur)) {
$i++;
$a = compte($dir);
foreach ($dir comme $d) {
$ftp_dir = $d .
$newdir = $this->getFtp_rawlist('/' . $ftp_dir);
foreach ($newdir as $key => $x) {
$firstChar = substr($newdir[$key][0], 0, 1);
$une = 8 ;
while ($a < count ($newdir[$key])) {
si ($a == 8) {
$fileName = $ftp_dir '/' . $newdir[$key][$a];
} autre {
$fileName = $fileName ' ' . $newdir[$key][$a];
}
$a++;
}
si ($firstChar != 'd') {
unset($nouveaurép[$clé]);
} elseif (!in_array($fileName, $dir)) {
$dir[] = $nomfichier ;
}
}
}
$b = compte ($dir);
}
retourner $rép;
}
fonction publique getFtp_rawlist($dir) {
$newArr = tableau();
$arr = ftp_rawlist($this->connectionId, $dir);
foreach ($arr comme $value) {
$stringArr = éclater(" ", $value);
$newArr[] = array_values(array_filter($stringArr));
}
renvoie $newArr ;
}</pré>
<p>Je suis troublé par ce problème depuis quelques jours et je suis de plus en plus désespéré. Si quelqu'un a des suggestions, n'hésitez pas à me le faire savoir</p>
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 :Si votre serveur prend en charge la fonction
MLSD
命令并且您有 PHP 7.2 或更高版本,则可以使用ftp_mlsd
: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 dossierMLSD
,那么您在判断条目是文件还是文件夹时尤其会遇到问题。虽然您可以使用ftp_size
技巧,但调用 每个条目的ftp_size
. Bien que vous puissiez utiliser l'astuceftp_size
, en appelantftp_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.
Pour le format DOS, voir : Obtenir la structure des répertoires à partir de FTP en utilisant PHP.