Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-FTP子目录递归?_Php_Recursion_Ftp_Subdirectory - Fatal编程技术网

PHP-FTP子目录递归?

PHP-FTP子目录递归?,php,recursion,ftp,subdirectory,Php,Recursion,Ftp,Subdirectory,下面的代码非常有效,我可以递归地成功下载目录。但是,我想下载这个目录中的目录。所以,当它连接时,它是在。在内部。目录是“中”的子目录。我想递归地检索In目录中的内容。目录名称本身将更改,因此我无法指定脚本本身中的内容。。。有人知道怎么做吗 ftp_sync ("./In/"); ftp_close($conn_id); function ftp_sync ($dir) { global $conn_id; if ($dir != ".") { if

下面的代码非常有效,我可以递归地成功下载目录。但是,我想下载这个目录中的目录。所以,当它连接时,它是在。在内部。目录是“中”的子目录。我想递归地检索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 ("..");

} 
ftp\u同步(“/In/”);
ftp_关闭($conn_id);
函数ftp\u sync($dir){
全球$conn_id;
如果($dir!=“){
if(ftp\u chdir($conn\u id,$dir)=false){
echo(“更改目录失败:$Dir
\r\n”); 返回; } if(!(is_dir($dir))) mkdir($dir); chdir($dir); } $contents=ftp\u nlist($conn\u id,“./In/”); foreach($file形式的内容){ 如果($file='.| |$file=''.') 继续; if(@ftp\u chdir($conn\u id,$file)){ ftp_chdir($conn_id,“…”); ftp_同步($file); } 其他的 ftp\u get($conn\u id,$file,$file,ftp\u二进制文件); } ftp_chdir($conn_id,“…”); chdir(“…”); }
您可以使用
递归DirectoryIterator
类:

$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";
}

示例,并根据您的喜好进行调整。

您可以使用以下代码:

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

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

上述代码在本地文件夹中运行良好。若要浏览ftp文件夹,请首先使用curlftpfs本地装载它们。