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

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

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

  1. SCP实现无需密码传输文件

    SCP概述 Linux为我们提供了两个用于文件copy的命令,一个是cp,一个是scp,但是他们略有不同 CP ----- 主要是用于在同一台电脑上,在不同的目录之间来回copy文件 SCP ---  ...

  2. Window、Ubuntu传输文件到阿里云服务器

    Ubuntu传输文件到阿里云服务器 scp -r file(ubuntu的文件) root(用户名)@xx.xx.xx.xx(公网ip):/home/(目标文件夹) Window传输文件到阿里云服务器 ...

  3. java基础 File 递归删除文件夹中所有文件文件夹 目录(包含子目录)下的.java文件复制到e:/abc文件夹中, 并统计java文件的个数

    File 递归删除文件夹中所有文件文件夹 package com.swift.kuozhan; import java.io.File; import java.util.Scanner; /*键盘录 ...

  4. C#递归复制文件夹

    /// <param name="sources">原路徑</param> /// <param name="dest">目 ...

  5. python实现某目录下将多个文件夹内的文件复制到一个文件夹中

    现实生活中,我们经常有这样的需求,如下图,有三个文件夹,文件夹1内含有1.txt文件 文件夹2中内含有2.txt文件,文件夹3中含有3.txt文件.我们有时候需要把1.txt, 2.txt, 3.tx ...

  6. linux如何复制文件夹和移动文件夹

    linux下文件的复制.移动与删除命令为:cp,mv,rm一.文件复制命令cp 命令格式:cp [-adfilprsu] 源文件(source) 目标文件(destination)cp [option ...

  7. linux复制文件到指定的文件夹

    copy命令      该命令的功能是将给出的文件或目录拷贝到另一文件或目录中,同MSDOS下的copy命令一样,功能十分强大. 语法: cp [选项] 源文件或目录 目标文件或目录 说明:该命令把指 ...

  8. C# 把一个文件夹下所有文件复制到另一个文件夹下 把一个文件夹下所有文件删除(转)

    C# 把一个文件夹下所有文件复制到另一个文件夹下   public static void CopyDirectory(string srcPath, string destPath) { try { ...

  9. linux复制文件夹、重命名文件夹、删除文件夹

    linux中复制命令为cp(即copy缩写),重命名使用mv命令(即move缩写)来实现,删除命令为rm(即remove缩写). 如果操作对象是单个文件,复制和删除以及重命名很简单,如下: cp a. ...

随机推荐

  1. kendo grid 点击新增没有反映

    在datasource中缺少 editable: "inline",这一行

  2. NOIP2013 提高组合集

    NOIP 2013 提高组 合集 D1 T1 转圈游戏 快速幂裸题 #include <iostream> #include <cstdio> #include <cst ...

  3. 基于QQ服务器JavaMail邮箱SSL密码第三方发送邮件

    网上javaMail邮箱推送代码太多,大都是有缺陷的,今天做项目刚好要用到,于是发了大半天的时间解决的这个问题. jar包:javax.mail.jar 代码: import java.io.IOEx ...

  4. 简单解决 WIN10更新后 远程桌面提示 CredSSP加密Oracle修正的问题

    更新WIN10后,打开远程桌面,提示: 以 管理员身份打开 cmd或者PowerShell,贴入: REG ADD HKLM\Software\Microsoft\Windows\CurrentVer ...

  5. CentOS 7: 配置Network

    Command Mode Step 1 » Network interface config files are located in /etc/sysconfig/network-scripts/  ...

  6. Linux ANSI 乱码问题

    原帖http://blog.chinaunix.net/u/24624/showart_184609.html Windows 到 linux 解决samba-3.x客户端中文乱码问题 dos cha ...

  7. ssh连接失败

    参考:http://www.cnblogs.com/starof/p/4709805.html https://www.chenyudong.com/archives/ssh-using-privat ...

  8. idea2016的使用心得 --- 太棒了

    今天打开myeclipse感觉里面全是project,也懒着换地方了,因为这些代码还要时常看,索性安装了idea试试水,感觉还不错,用起来并不比myeclipse差,跟webstorm差不多,他俩就是 ...

  9. IE浏览器 多版本之间切换

    由于Win7系统最低支持IE8的版本,不能通过安装IE7版本来达到要求. 有一个替代方案,通过IE自带Emulation来实现,实现步骤如下: 打开现有的IE浏览器 按下F12键 切换到“Emulat ...

  10. bzoj 2217 Lollipop

    题目大意: 有一个长度为n的序列a1,a2,...,an.其中ai要么是1("W"),要么是2("T") 现在有m个询问,每个询问是询问有没有一个连续的子序列, ...