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

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

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. Ubuntu 16.04安装Sublime Text3

    1.安装: sudo add-apt-repository ppa:webupd8team/sublime-text-3 sudo apt-get update sudo apt-get instal ...

  2. Oracle Multitenant Environment (五) Create PDB

    Creating and Removing PDBs with SQL*Plus This chapter contains the following topics: About Creating ...

  3. 墨卡托坐标与LBS应用

    今天了解到这边的LBS应用,一般用的是墨卡托坐标. 也就是商品库的商品入库的时候,会根据输入,使用百度地图提供的一个API,来转换成一个墨卡托坐标. 然后用户流量过来的时候,会带来历史坐标,和当前坐标 ...

  4. C++中const引用的是对象的时候只能调用该对象的f()const方法

    const引用的作用: 1. 避免不必要的复制.  2. 限制不能修改对象. const 引用的是对象时只能访问该对象的const 函数  例: class A { public: void cons ...

  5. 【python】蛋疼的中文乱码解决方案

    转自: http://yooooo.us/2013/python-encoding-decoding?variant=zh-cn

  6. ZOJ 3675 Trim the Nails(bfs)

    Trim the Nails Time Limit: 2 Seconds      Memory Limit: 65536 KB Robert is clipping his fingernails. ...

  7. linux驱动之LED驱动_1

    步骤: 1.框架 2.完好硬件的操作: a.看原理图.引脚 b.看2440手冊 c.写代码: IO口须要用ioremap映射 我的板子电路例如以下所看到的 1.配置GPBCON 寄存器,配置输出   ...

  8. Apache Kafka-0.8.1.1源代码编译

    作者:过往记忆 | 新浪微博:左手牵右手TEL | 能够转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明博客地址:http://www.iteblog.com/文章标题:<Apac ...

  9. codeforces 939E Maximize! 双指针(two pointers)

    E. Maximize! time limit per test 3 seconds memory limit per test 256 megabytes input standard input ...

  10. [Swift通天遁地]六、智能布局-(6)其他几种约束关系:父视图/Corner/Edge/AnchorAndFillEdge

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...