2009-10-24 4 views
1

Le code ci-dessous fonctionne de telle sorte que je puisse télécharger le répertoire de manière récursive. Mais, je veux télécharger les répertoires dans ce répertoire. Donc, quand il se connecte c'est dans. Dans le. Le répertoire est un sous-répertoire "In". Je veux récupérer récursivement le contenu dans le répertoire In. Les noms des répertoires eux-mêmes vont changer, donc je ne peux pas spécifier ce que cela va être dans le script lui-même ... Quelqu'un sait comment faire cela?PHP - Sous-répertoire FTP récursivement?

ftp_sync ("./In/");  
ftp_close($conn_id); 

function ftp_sync ($dir) { 

    global $conn_id; 

    if ($dir != ".") { 
     if (ftp_chdir($conn_id, $dir) == false) { 
      echo ("Change Dir Failed: $dir<BR>\r\n"); 
      return; 
     } 
     if (!(is_dir($dir))) 
      mkdir($dir); 
     chdir ($dir); 
    } 

    $contents = ftp_nlist($conn_id, "./In/"); 
    foreach ($contents as $file) { 

     if ($file == '.' || $file == '..') 
      continue; 

     if (@ftp_chdir($conn_id, $file)) { 
      ftp_chdir ($conn_id, ".."); 
      ftp_sync ($file); 
     } 
     else 
      ftp_get($conn_id, $file, $file, FTP_BINARY); 
    } 

    ftp_chdir ($conn_id, ".."); 
    chdir (".."); 

} 

Répondre

3

Vous pouvez utiliser la classe RecursiveDirectoryIterator:

$ite=new RecursiveDirectoryIterator("/path/"); 

$bytestotal=0; 
$nbfiles=0; 
foreach (new RecursiveIteratorIterator($ite) as $filename=>$cur) { 
    $filesize=$cur->getSize(); 
    $bytestotal+=$filesize; 
    $nbfiles++; 
    echo "$filename => $filesize\n"; 
} 

Exemple volé http://www.php.net/manual/en/class.recursivedirectoryiterator.php et adapter à votre goût.

+0

Le code ci-dessus fonctionne bien sur les dossiers locaux. Pour le faire parcourir les dossiers ftp, montez-les d'abord localement avec curlftpfs. – witkacy26

-1

Vous pouvez utiliser le code suivant:

public static function download($local_dir, $remote_dir, $ftp_conn) { 

    if ($remote_dir != ".") { 
     if (ftp_chdir($ftp_conn, $remote_dir) == false) { 
      echo ("Change Dir Failed: $remote_dir \n"); 
      return; 
     } 
     if (!(is_dir($remote_dir)) ){ 
      mkdir($remote_dir); 
      echo "-> Folder created: ".$remote_dir." \n"; 
     } 

     chdir($remote_dir); 
    } 

    $contents = ftp_nlist($ftp_conn, "."); 


    foreach ($contents as $file) { 

     if ($file == '.' || $file == '..') continue; 

     if (@ftp_chdir($ftp_conn, $file)) { 
      ftp_chdir($ftp_conn, ".."); 
      ftpmanager::download($local_dir."/".$file, $file, $ftp_conn); 
     } 
     else { 
      echo "----> path for local file: "."$local_dir/$file"." \n"; 
      echo "----> path for remote file: ".$file." \n"; 
      ftp_get($ftp_conn, "$local_dir/$file", "$file", FTP_BINARY); 
      echo "-> Downloaded file: ".$local_dir."/".$file." \n"; 
     } 

    } 

    ftp_chdir($ftp_conn, ".."); 
    chdir(".."); 
} 

Il suffit d'insérer cette fonction statique dans un objet et l'appeler:

myobject::download($sBackUpFullCurrentPath, '.', $rConnection); 

Hope this vous d'aide ou d'autres.

Questions connexes