項目中須要複製整個文件夾,有時候還須要將整個文件夾傳輸到遠程服務器。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