2009-10-24 3 views
1

Код ниже работает настолько, что я могу успешно загрузить каталог рекурсивно. Но я хочу загрузить каталоги в этом каталоге. Итак, когда он подключается, он входит. Внутри. directory - это подкаталог «In». Я хочу рекурсивно получить содержимое в каталоге In. Имена самих каталогов будут меняться, поэтому я не могу указать, что будет в самом скрипте ... Кто-нибудь знает, как это сделать?PHP-подкаталог FTP рекурсивно?

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 (".."); 

} 

ответ

3

Вы можете использовать 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"; 
} 

Пример украденную из http://www.php.net/manual/en/class.recursivedirectoryiterator.php и разместить его по своему вкусу.

+0

Над кодом хорошо работает в локальных папках. Чтобы он просматривал ftp-папки, сначала монтируйте их локально с помощью curlftpfs. – witkacy26

-1

Вы можете использовать следующий код:

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(".."); 
} 

Просто вставьте эту статическую функцию в объекте и назвать его:

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

Надеется, что это поможет вам или другим.

Смежные вопросы