【问题标题】:PHP - FTP subdirectory recursively?PHP - 递归的FTP子目录?
【发布时间】:2010-12-09 15:42:13
【问题描述】:

下面的代码可以成功地递归下载目录。但是,我想下载这个目录中的目录。因此,当它连接时,它位于 .内。目录是一个子目录“In”。我想递归检索 In 目录中的内容。目录名称本身会改变,所以我无法指定脚本本身的内容......有人知道该怎么做吗?

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

} 

【问题讨论】:

    标签: php recursion ftp subdirectory


    【解决方案1】:

    您可以使用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 窃取的示例,并根据您的喜好调整。

    【讨论】:

    • 以上代码在本地文件夹上运行良好。要使其浏览 ftp 文件夹,请先使用 curlftpfs 在本地安装它们。
    【解决方案2】:

    您可以使用以下代码:

    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 );
    

    希望这对您或其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-11-06
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-16
      • 2017-03-26
      • 1970-01-01
      相关资源
      最近更新 更多