【问题标题】:I need to copy only selected files and folders in PHP我只需要在 PHP 中复制选定的文件和文件夹
【发布时间】:2011-02-21 17:21:19
【问题描述】:

我在 WINDOWS 操作系统和 PHP 脚本中使用以下代码,其中最初我采用两个文件夹结构的差异,然后需要将输出复制到其他文件夹。这是下面的代码..

$source = '/var/www/html/copy1';
$mirror = '/var/www/html/copy2';
function scan_dir_recursive($dir, $rel = null) {

  $all_paths = array();
  $new_paths = scandir($dir);

  foreach ($new_paths as $path) {

    if ($path == '.' || $path == '..') {
      continue;
    }

    if ($rel === null) {
        $path_with_rel = $path;
    } else {
        $path_with_rel = $rel . DIRECTORY_SEPARATOR . $path;
    }

    $full_path = $dir . DIRECTORY_SEPARATOR . $path;
    $all_paths[] = $path_with_rel;

    if (is_dir($full_path)) {
      $all_paths = array_merge(
        $all_paths, scan_dir_recursive($full_path, $path_with_rel)
      );
    }

  }

  return $all_paths;

}
$diff_paths = array_diff(
    scan_dir_recursive($mirror),
    scan_dir_recursive($source)
);


/*$diff_path = array_diff($mirror,$original);*/
echo "<pre>Difference ";print_r($diff_paths);
    Difference of Folders Array
(
    [4] => New Folder (2)
    [5] => New Folder (2)/New Folder
    [6] => New Folder (2)/New Folder/New Folder
    [7] => New Folder (2)/New Folder/New Folder/New Text Document (2).txt
    [8] => New Folder (2)/New Folder/New Folder/New Text Document.txt
)

foreach($diff_paths as $path)
{
    echo $source1 = "var/www/html/copy2/".$path;
    echo "<br>";
    $des = "var/www/html/copy1/".$path;
    copy_recursive_dirs($source1, $des);
}

function copy_recursive_dirs($dirsource, $dirdest)
{ 
   $dir_handle=opendir($dirsource);

    mkdir($dirdest,0777);

 while(false!==($file=readdir($dir_handle)))
 {/*echo "<pre>";
  print_r($file);*/
     if($file!="." && $file!="..")
     {
         if(is_dir($dirsource.DIRECTORY_SEPARATOR.$file)) 
         {
            //Copy the file at the same level in the destination folder
            copy_recursive_dirs($dirsource.DIRECTORY_SEPARATOR.$file, $dirdest.DIRECTORY_SEPARATOR.$file);

         }
         else{
            //Copy the dir at the same lavel in the destination folder
             copy ($dirsource.DIRECTORY_SEPARATOR.$file, $dirdest.DIRECTORY_SEPARATOR.$file);

         }
     }
  }
 closedir($dir_handle);
 return true;
}

每当我执行脚本时,我都会得到不同的输出,但不会根据代码在第二个文件夹中获得另一个副本...请帮助我纠正...

更新 我只想将差异复制到 其他文件夹,如果有其他文件夹 请帮我....

更新: 我收到这些错误,

( ! ) 警告: opendir(var/www/html/copy2/新建文件夹 (2)) [function.opendir]: 失败 打开目录:没有这样的文件或目录 /var/www/html/pranav_test/syncss.php 在第 96 行

( ! ) 警告:mkdir() [function.mkdir]:没有这样的文件或 目录在 /var/www/html/pranav_test/syncss.php 在第 99 行

( ! ) 警告:readdir():提供 参数不是有效的目录 资源在 /var/www/html/pranav_test/syncss.php 在第 104 行

( ! ) 警告:closedir():已提供 参数不是有效的目录 资源在 /var/www/html/pranav_test/syncss.php 在第 122 行

【问题讨论】:

  • @Col。弹片 什么样的人你没有任何常识,经过几次尝试调试后有人来问这里有问题......我可以帮我帮助我,否则不要灰心其他人不帮助我。 ..
  • 你是怎么尝试的?尝试过哪些调试技术?
  • @Col。弹片我试图简单地复制没有工作的不同文件夹,我尝试 id 迭代它检查输出是否是目录,如果它是 mkdir 应该执行.. 和许多其他方式.. 但这些都不适合我...
  • 我不是在乞求任何人。我来这里是为了学习,解决我正在经历的问题,如果你觉得它是在乞求,那么我是一个最好的乞讨者,可以像我一样学习可以.... :)
  • 嗯,消息很清楚。检查文件路径。在第一条消息中它说var/,而不是/var,它应该是

标签: php directory copy


【解决方案1】:

不要试图一次做所有事情。
将您的任务分成更小的块。
并且只有在您完成并测试了上一部分后才能传递到下一个。

首先,学习找出2个数组之间的差异:
在您的脚本中硬编码 2 个略有不同的数组并使用 array_diff() 函数

接下来,学习从目录中读取文件。不是递归的,只有一个。
以文件名数组结束。
print_r()测试一下

现在您可以尝试将 2 个目录读入数组并进行比较。
如果还是不行,调试一下:打印出数组的内容,用眼睛对比一下。使用直截了当的输入数据,针对这个特定的特定问题寻求帮助。 最终会产生一系列差异,打印在屏幕上以确保其中包含实际数据。

好吧,现在你可以去复制部分了。相同的技术。

然后你可以去递归目录。相同的技术 - 在每个阶段进行双重检查和测试。打印出尽可能多的调试信息。

打开错误报告并确保您可以看到发生的每个错误(只需制作一个有意的错误并查看)。 每个文件系统操作都会在失败时抛出错误。所以,你会看到原因。并调试文件系统操作。从条件内部打印出来,看看它是否被执行过。打印出变量内容,函数返回值。

有没有好奇过,这条$dirsource.DIRECTORY_SEPARATOR.$file 线路的实际值是多少?

【讨论】:

  • +1 感谢 bud 的支持,但我的数组差异工作正常.. 对我来说,我只面临复制差异目录的问题......
  • @OM 打开错误报告并确保您可以看到发生的每一个错误(只需故意制造一个并查看)。 每个 文件系统操作都会在失败时抛出错误。所以,你会看到原因。并调试文件系统操作。从条件内部打印出来,看看代码是否被执行过。打印出变量内容,函数返回值。
  • 谢谢 COL 我们做到了.......它现在工作...... :) 谢谢你的苛刻的话......它迫使我努力实现我的输出
猜你喜欢
  • 2017-08-14
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 2018-01-23
  • 2013-02-27
  • 1970-01-01
  • 2020-07-16
  • 2013-01-31
相关资源
最近更新 更多