项目中需要复制整个文件夹,有时候还需要将整个文件夹传输到远程服务器。
这里就要递归遍历整个文件夹了,想看递归遍历文件夹的代码。
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的博文。
时间: 2024-12-25 03:57:06