PHP递归复制文件夹以及传输文件夹到其他服务器。

Posted 岁月无心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP递归复制文件夹以及传输文件夹到其他服务器。相关的知识,希望对你有一定的参考价值。

项目中需要复制整个文件夹,有时候还需要将整个文件夹传输到远程服务器。

这里就要递归遍历整个文件夹了,想看递归遍历文件夹的代码。

 

function deepScanDir($dir) {
    $fileArr = array ();
    $dirArr = array ();
    $dir = rtrim($dir, \'//\');
    if (is_dir($dir)) {
        $dirHandle = opendir($dir);
        while (false !== ($fileName = readdir($dirHandle))) {
            $subFile = $dir . DIRECTORY_SEPARATOR . $fileName;
            if (is_file($subFile)) {
                $fileArr[] = $subFile;
            }
            elseif (is_dir($subFile) && str_replace(\'.\', \'\', $fileName) != \'\') {
                $dirArr[] = $subFile;
                $arr = deepScanDir($subFile);
                $dirArr = array_merge($dirArr, $arr[\'dir\']);
                $fileArr = array_merge($fileArr, $arr[\'file\']);
            }


        }
        closedir($dirHandle);
    }
    return array (
        \'dir\' => $dirArr,
        \'file\' => $fileArr
    );
}
以上会遍历一个文件夹,最后返回整个文件夹以及文件。

复制文件夹和传输文件夹就要在这个方法的基础上完成。

先来复制文件夹,除了上面的遍历方法,复制文件夹主要用到php中的copy($source,$destination)函数。

$source是你要复制的文件夹,$destination是复制文件的目的地
function copy_dir($dir,$todir) {
    $dir = rtrim($dir, \'//\');
    if (is_dir($dir)) {
        $path=$todir."/".basename($dir);
   mdir($path,0777);      //创建文件夹
        $dirHandle = opendir($dir);
        while (false !== ($fileName = readdir($dirHandle))) {
            $subFile = $dir . DIRECTORY_SEPARATOR . $fileName;
            if (is_file($subFile)) {
                $b=$path."/".$fileName;
                copy($subFile,$b);
            }
            elseif (is_dir($subFile) && str_replace(\'.\', \'\', $fileName) != \'\') {
              $c=$path."/".basename($subFile) 
              mdir($c,0777);      //创建文件夹
               copy_dir($subFile,$path);
            }
        }
        closedir($dirHandle);
    }
} 

以上是复制文件夹,接下来尝试传输文件夹到远程服务器。这里我用linux下的php_ssh2进行传输(FTP也可以,这里就不讲了)

$ssh2 = ssh2_connect($ssh_host, $ssh_port);        //先用SSH连接linux服务器,这里略过,具体方法参考另一篇博文http://www.cnblogs.com/suiyuewuxin/p/6858105.html

function scp_dir($dir,$todir,$ssh2) {
    $dir = rtrim($dir, \'//\');
    if (is_dir($dir)) {
        $path=$todir."/".basename($dir);
        $c="mkdir -m 777 ".$path;
        ssh2_exec($ssh2, $c);
        $dirHandle = opendir($dir);
        while (false !== ($fileName = readdir($dirHandle))) {
            $subFile = $dir . DIRECTORY_SEPARATOR . $fileName;
            if (is_file($subFile)) {
                $b=$path."/".$fileName;
                ssh2_scp_send($ssh2, $subFile, $b, 0644);
            }
            elseif (is_dir($subFile) && str_replace(\'.\', \'\', $fileName) != \'\') {
                $c="mkdir -m 777 ".$path."/".basename($subFile);
                ssh2_exec($ssh2, $c);
                scp_dir($subFile,$path,$ssh2);
            }
        }
        closedir($dirHandle);
    }
}

这里结合php_ssh2组件和scp_scp_send方法进行递归传输,遇到文件夹时创建文件夹,遇到文件时则传输文件。

下面是更细化一点的,将一个文件夹下的所有文件递归传输到目标文件夹下。

function scp_send($dir,$todir,$ssh2){
    $dirHandle = opendir($dir);
    while (false !== ($fileName = readdir($dirHandle))) {
            $subFile = $dir . DIRECTORY_SEPARATOR . $fileName;
            if (is_file($subFile)) {
                $b=$todir."/".$fileName;
                $stream=ssh2_scp_send($ssh2, $subFile, $b, 0644);
            }
            elseif (is_dir($subFile) && str_replace(\'.\', \'\', $fileName) != \'\') {
                $c="mkdir -m 777 ".$dir."/".basename($subFile);
                ssh2_exec($ssh2, $c);
                scp_dir($subFile,$todir,$ssh2);
            }
        }
    closedir($dirHandle);
}

这个方法利用了上一个方法,不同的是最外层文件夹并没有传输过去,这样可以用来创建新项目.

代码中不清楚的可以参考其他几篇关于ssh2和scp的博文。

以上是关于PHP递归复制文件夹以及传输文件夹到其他服务器。的主要内容,如果未能解决你的问题,请参考以下文章

递归复制文件夹,排除部分文件夹

如何将文件递归复制到具有特定名称的所有文件夹中(首选批处理文件)

PHP的递归删除目录功能?

如果文件不匹配,则递归地将一个目录复制到另一个目录

如何按文件类型递归查找文件并将它们复制到目录?

SCP服务传输文件