码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2017-05-16 20:53:16      阅读:274      评论:0      收藏:0      [点我收藏+]

标签:项目   html   遍历   sub   copy   ssh2   mdi   []   blog   

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

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

 

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递归复制文件夹以及传输文件夹到其他服务器。

标签:项目   html   遍历   sub   copy   ssh2   mdi   []   blog   

原文地址:http://www.cnblogs.com/suiyuewuxin/p/6863449.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!