PHP遞歸複製文件夾以及傳輸文件夾到其餘服務器。

項目中須要複製整個文件夾,有時候還須要將整個文件夾傳輸到遠程服務器。php

這裏就要遞歸遍歷整個文件夾了,想看遞歸遍歷文件夾的代碼。html

 

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也能夠,這裏就不講了)linux

$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方法進行遞歸傳輸,遇到文件夾時建立文件夾,遇到文件時則傳輸文件。服務器

下面是更細化一點的,將一個文件夾下的全部文件遞歸傳輸到目標文件夾下。ssh

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

相關文章
相關標籤/搜索