• 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的博文。

  • 相关阅读:
    Expected an assignment or function call and instead saw an expression
    ES6 中Object 的动态Key
    dotnet ef 无法执行,因为找不到指定的命令或文件
    Vue中的vfor
    使用TS开发Vue项目引入json文件报错处理
    JavaScript 防抖和节流
    MacOs 10.15.6 install pyodbc Tank
    一维数组转二维数组
    根据条件过滤目录树(子级匹配也要保留父级)
    跨域测试
  • 原文地址:https://www.cnblogs.com/suiyuewuxin/p/6863449.html
Copyright © 2020-2023  润新知