recherche

Maison  >  Questions et réponses  >  le corps du texte

Liste des répertoires récursifs PHP FTP

<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>
P粉621033928P粉621033928459 Il y a quelques jours713

répondre à tous(2)je répondrai

  • P粉903052556

    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
    

    répondre
    0
  • P粉763662390

    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.

    répondre
    0
  • Annulerrépondre