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

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

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. JAVA内存模型与线程以及volatile理解

    Java内存模型是围绕在并发过程中如何处理原子性.可见性.有序性来建立的. 一.主内存与工作内存 Java内存模型主要目标是在虚拟机中将变量存储到内存和从内存中取出变量.这里的变量包括:实例字段.静态 ...

  2. 四则运算结对编程(GUI)

    四则运算GUI coding地址:https://git.dev.tencent.com/qyj814/GUI.git 结对伙伴:李梦宇 一.题目要求 定制出题要求.每次出题时用户都可以在界面上定制如 ...

  3. some notes about ADDM and AWR

    Use the sophisticated management and monitoring features of the Oracle DatabaseDiagnostic and Tuning ...

  4. mysql Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’

    mysql Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ 今天在linux中安装了mys ...

  5. java 反射和暴力反射 两个DEMO

    </pre><pre code_snippet_id="402084" snippet_file_name="blog_20140622_5_93502 ...

  6. w3m命令行模式浏览网页

    w3m是一个基于文本的网页浏览器,支持多种操作系统,在命令行终端可以很好的支持中文.即使在没有鼠标支持的情况下也可以检查网页的输出. 我们一般用Ubuntu的X Windows来看图形界面的东西,有没 ...

  7. HDU 5305 Friends(dfs)

    Friends Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Su ...

  8. LeetCode 203. Remove Linked List Elements (移除链表中的项)

    Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> 2 --& ...

  9. MyBatis 中#{}与${}绑定参数的区别

    MyBatis 中#{}与${}绑定参数的区别: #{}将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #{id},如果传入的值是111,那么解析成sql时的值为o ...

  10. 【C++】双向线性链表容器的实现

    // 双向线性链表容器 #include <cstring> #include <iostream> #include <stdexcept> using name ...