PHP递归复制文件夹以及传输文件夹到其他服务器。

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

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

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

PHP递归复制文件夹以及传输文件夹到其他服务器。的相关文章

本文示例如何使用SAP FTP Function将文件从应用服务器传输到另外一个FTP服务器上。

DATA: BEGIN OF ig_ftp_result OCCURS 0, line(100), END OF ig_ftp_result. DATA: l_path(128)       TYPE c.  "文件路径,必须以/结尾 DATA: l_filename(128)   TYPE c.  "文件名 DATA: l_ftpcommand(100) TYPE c.  "FTP命令 DATA: l_handle          TYPE i.             

SCP实现无需密码传输文件

SCP概述 Linux为我们提供了两个用于文件copy的命令,一个是cp,一个是scp,但是他们略有不同 CP ----- 主要是用于在同一台电脑上,在不同的目录之间来回copy文件 SCP --- 主要是在不同的Linux系统之间来回copy文件 下面我们就主要讲一下SCP命令的基本用法: scp 传输文件路径 用户名@传输文件目标IP:目标路径(可以指定新的文件名) 在Linux环境下,两台主机之间传输文件一般使用scp命令,通常用scp命令通过ssh获取对方linux主机文件的时候都需要手

Exchange 2013 PowerShell 传输文件及并行管道

自从Exchange 2013管理Shell命令是通过远程PowerShell会话执行,导入和导出文件需要一个新的特定参数.大概有上百个Shell命令需要用到,那么这一小节,我们就看看如何使用这些参数通过远程Shell连接进行传输文件的. 传输文件工作方式: 假如你正在当前活动目录站点中创建一个边缘订阅中心到传输服务器.当你在边缘服务器上生成了xml文件后,你可以通过New-EdgeSubscription命令,具体语法如下: [byte[]]$data = Get-Content -Path

C#递归复制文件夹

/// <param name="sources">原路徑</param> /// <param name="dest">目標路徑</param> private void CopyFile(string sources, string dest) { if (Directory.Exists(sources)) { DirectoryInfo dinfo = new DirectoryInfo(sources);//

java递归复制文件及文件夹

package base; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.File; import java.io.InputStream; import java.io.OutputStream; public class copy { public static void main(String[] args) throws

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

copy命令      该命令的功能是将给出的文件或目录拷贝到另一文件或目录中,同MSDOS下的copy命令一样,功能十分强大. 语法: cp [选项] 源文件或目录 目标文件或目录 说明:该命令把指定的源文件复制到目标文件或把多个源文件复制到目标目录中. 该命令的各选项含义如下: - a 该选项通常在拷贝目录时使用.它保留链接.文件属性,并递归地拷贝目录,其作用等于dpR选项的组合. - d 拷贝时保留链接. - f 删除已经存在的目标文件而不提示. - i 和f选项相反,在覆盖目标文件之前将

PHP 查看文件夹大小、复制文件夹、删除文件夹

PHP虽然提供了 filesize.copy.unlink 等文件操作的函数,但是没有提供 dirsize.copydir.rmdirs 等文件夹操作的函数(rmdir也只能删除空目录).所以只能手动编写这些函数,主要的技巧是通过递归将问题逐层分解,直到分解成可以直接解决的最小子问题. ====================查看文件夹大小===================== 由于文件夹是没有大小的,平常所说的文件夹尺寸准确的说应该是文件夹中所有文件的总大小.所以只需要将文件夹逐层查找,统

使用批处理查找某个文件夹及其子文件夹(递归地)中存在的空文件夹

缘起:网上下载了一份源代码,但是由于其中的存在某些空文件夹,而且文件夹特别多,且目录也比较深,所以写一个批处理,用来查找出这份源代码中的空文件夹,使其可以在github上提交 1 @echo off 2 cls 3 rem --- main program --- 4 set baseDir=C:\Users\Desktop\src\src\com\sourcecode 5 6 echo --- callBefore --- 7 call :subPro 8 echo --- callAfter

oc NSFileManager 文件夹创建、文件移动、文件复制、文件重命名

// 初始化管理类 NSFileManager * manager = [NSFileManager defaultManager]; // 路径 NSString * DirectoryPath = [NSHomeDirectory() stringByAppendingPathComponent:@"/desktop/我的文件夹1/我的文件夹2"]; NSError * error = nil; if ([manager createDirectoryAtPath:Director