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

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

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. kafka 在阿里云部署

    https://blog.csdn.net/chenyulancn/article/details/79499401 https://www.cnblogs.com/yangtianle/p/8761 ...

  2. I - 最少拦截系统

    #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; ],su ...

  3. 洛谷—— P1419 寻找段落

    https://www.luogu.org/problem/show?pid=1419 题目描述 给定一个长度为n的序列a_i,定义a[i]为第i个元素的价值.现在需要找出序列中最有价值的“段落”.段 ...

  4. codevs——2645 Spore

    2645 Spore  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 某陈和某Y 最近对一个游戏着迷.那 ...

  5. VS2017 +NetCore2.2.0+WebApi项目整合SwaggerUI 以及遇到的坑

    1.新建一个WebApi项目,这里不说了. 2.打开项目nuget管理控制台,在 https://www.nuget.org/ 搜索swagger的包:Swashbuckle.AspNetCore , ...

  6. iOS8開始默认语言有变化

    [问题] 測试组发现APP在iOS8及以上系统设备上,语言设置为我们不支持的小语种时.APP没有使用默认的英文,而是选择了上一次设置的语言. [分析] 经过研究发现,在iOS8系统開始,在设备语言设置 ...

  7. 谈谈c++纯虚函数的意义!

    纯虚函数的存在有什么意义呢?相信大学假设有c++这么课程.在讲到纯虚函数时,必然会讲到纯虚函数是面向接口编程的基础. 如今和大家分享下纯虚函数设计的原由.目的.产生的效果. 现代软件project很庞 ...

  8. PhoneGap:JS跨域请求

    PhoneGap开发,理论上好处多多.但因为javascript是其中的主角,并且是直接存放于手机,跟服务器数据交互,就会有一个跨域访问的问题. 当然,这个问题肯定有解决方案,不然的话,这种利用Pho ...

  9. [linux环境配置]个人用持续更新ing~

    alias ll='ls -la' export PATH=$PATH:~/Desktop/myscript alias gpush='git push origin HEAD:refs/for/ma ...

  10. luoguP2939 [USACO09FEB]改造路Revamping Trails

    约翰一共有N)个牧场.由M条布满尘埃的小径连接.小径可 以双向通行.每天早上约翰从牧场1出发到牧场N去给奶牛检查身体. 通过每条小径都需要消耗一定的时间.约翰打算升级其中K条小径,使之成为高 速公路. ...