【问题标题】:move all files in a folder to another?将文件夹中的所有文件移动到另一个文件夹中?
【发布时间】:2010-01-17 18:45:46
【问题描述】:

当我将一个文件从一个位置移动到另一个位置时

rename('path/filename', 'newpath/filename');

如何将一个文件夹中的所有文件移动到另一个文件夹?试过这个没有结果:

rename('path/*', 'newpath/*');

【问题讨论】:

  • 需要保留原目录吗?
  • 保留原始文件夹会很好...不是这次,但也许下次我将不得不保留它..我可以怀疑您的方法是什么=)
  • 但我注意到我在目标文件夹中找到了我想要保留的文件。然后你的方法不起作用,因为它不允许将文件夹移动到已经包含文件的目标文件夹
  • 似乎很难在php..weird中做这种琐碎的事情:/
  • 我在stackoverflow.com/questions/2082138/…下方更新了我的解决方案

标签: php file


【解决方案1】:

稍微冗长的解决方案:

// Get array of all source files
$files = scandir("source");
// Identify directories
$source = "source/";
$destination = "destination/";
// Cycle through all source files
foreach ($files as $file) {
  if (in_array($file, array(".",".."))) continue;
  // If we copied this successfully, mark it for deletion
  if (copy($source.$file, $destination.$file)) {
    $delete[] = $source.$file;
  }
}
// Delete all successfully-copied files
foreach ($delete as $file) {
  unlink($file);
}

【讨论】:

  • 我在目标文件夹中有文件,我想保留它们。只需将文件从临时文件夹移动到该文件夹​​,这样您就可以一直添加文件。
  • 我不明白这一行: if (in_array($file, array(".",".."))) continue;它在做什么?
  • Noname,这个数组中的两个项目将是“。”代表“当前”目录,“..”代表“上一个”目录。当我们遇到这些时,我们只是“继续”,这意味着我们跳过当前的迭代。
  • 这是一个很棒的功能,除非源文件夹中有目录。有没有办法绕过这个?并且没有为这些操作提供类的库吗? zend 框架?
  • 这是一个不错的解决方案,但是更好的方法是使用 PHP 的 rename() 函数,如下面的答案所示。更少的代码 = 更快的处理速度。 :)
【解决方案2】:

使用 rename() 并进行一些错误检查的替代方法:

$srcDir = 'dir1';
$destDir = 'dir2';

if (file_exists($destDir)) {
  if (is_dir($destDir)) {
    if (is_writable($destDir)) {
      if ($handle = opendir($srcDir)) {
        while (false !== ($file = readdir($handle))) {
          if (is_file($srcDir . '/' . $file)) {
            rename($srcDir . '/' . $file, $destDir . '/' . $file);
          }
        }
        closedir($handle);
      } else {
        echo "$srcDir could not be opened.\n";
      }
    } else {
      echo "$destDir is not writable!\n";
    }
  } else {
    echo "$destDir is not a directory!\n";
  }
} else {
  echo "$destDir does not exist\n";
}

【讨论】:

    【解决方案3】:

    请试试这个解决方案,测试成功::

    <?php
      $files = scandir("f1");
      $oldfolder = "f1/";
      $newfolder = "f2/";
      foreach($files as $fname) {
          if($fname != '.' && $fname != '..') {
              rename($oldfolder.$fname, $newfolder.$fname);
          }
      }
    ?>
    

    【讨论】:

      【解决方案4】:

      试过这个吗?:

           <?php
      
           $oldfolderpath = "old/folder";
           $newfolderpath = "new/folder";
      
           rename($oldfolderpath,$newfolderpath);
           ?>
      

      【讨论】:

        【解决方案5】:

        所以我尝试按照描述使用rename() 函数,但我不断收到错误消息,指出存在no such file or directory。我将代码放在 if else 语句中,以确保我确实创建了目录。它看起来像这样:

        $tempDir = '/home/site/images/tmp/';
        $permanentDir = '/home/site/images/' . $claimid; // this was stored above
        mkdir($permanentDir,0775);
        if(is_dir($permanentDir)){
            echo $permanentDir . ' is a directory';
            if(is_dir($tempDir)){
                echo $tempDir . ' is a directory';
            }else{
                echo $tempDir . ' is not a directory';
            }
        }else{
            echo $permanentDir . ' is not a directory';
        }
        
        rename($tempDir . "*", $permanentDir);
        

        所以当我再次运行代码时,它发现两个路径都是目录。我被难住了。我与一位同事交谈,他建议,“为什么不直接将临时目录重命名为新目录,因为您仍然想移动所有文件?”

        事实证明,这就是我最终要做的。我放弃了尝试将通配符与rename() 函数一起使用,而是只使用rename() 将临时目录重命名为永久目录。

        所以它看起来像这样。

        $tempDir = '/home/site/images/tmp/';
        $permanentDir = '/home/site/images/' . $claimid; // this was stored above
        mkdir($permanentDir,0775);
        
        rename($tempDir, $permanentDir);
        

        这非常适合我的目的,因为在文件上传和“移动”后我不需要旧的 tmp 目录保留在那里。

        希望这会有所帮助。如果有人知道为什么通配符在 rename() 函数中不起作用以及为什么我收到上述错误,请告诉我。

        【讨论】:

          【解决方案6】:

          移动或复制我使用它的方式

          function copyfiles($source_folder, $target_folder, $move=false) {
              $source_folder=trim($source_folder, '/').'/';
              $target_folder=trim($target_folder, '/').'/';
              $files = scandir($source_folder);
              foreach($files as $file) {
                  if($file != '.' && $file != '..') {
                      if ($move) {
                          rename($source_folder.$file, $target_folder.$file);
                      } else {
                          copy($source_folder.$file, $target_folder.$file);
                      }
                  }
              }   
          }
          
          function movefiles($source_folder, $target_folder) {
              copyfiles($source_folder, $target_folder, $move=true);
          }
          

          【讨论】:

            【解决方案7】:

            试试这个: 重命名('path/*', 'newpath/');

            我认为在目的地有一个星号没有意义

            【讨论】:

              【解决方案8】:

              如果目标目录不存在,则需要先创建:

              mkdir('newpath');
              rename('path/*', 'newpath/');
              

              【讨论】:

              • 这个答案对我不起作用。如果重命名函数支持 glob,那就太好了,但从 PHP7 开始,情况似乎并非如此。示例:rename(/home/eric/wordpress/files/.tmp-checksum/*,/home/eric/wordpress/files/core): No such file or directory 但是,在 bash shell 中运行 ls /home/eric/wordpress/files/.tmp-checksum/* 确实会显示很多文件。
              【解决方案9】:

              作为旁注;当您将文件复制到另一个文件夹时,它们的最后更改时间将成为当前时间戳。所以你应该touch() 新文件。

              ... (some codes for directory looping) ...
              if (copy($source.$file, $destination.$file)) {
                 $delete[] = $source.$file;
              
                 $filetimestamp = filemtime($source.$file); 
                 touch($destination.$file,$filetimestamp);
              }
              ... (some codes) ...
              

              【讨论】:

                【解决方案10】:

                不确定这是否对任何人有帮助,但我想我还是会发布。我遇到了一个挑战,我有大量通过各种在线商店购买和下载的电影,它们都存储在一个文件夹中,但都存储在它们自己的子文件夹中,并且都具有不同的命名约定。我想将它们全部移入父文件夹并将它们全部重命名以使其看起来更漂亮。我设法使用批量重命名工具和条件名称格式重命名的所有子文件夹。子文件夹中有我不想要的其他文件。所以我编写了以下 php 脚本,1. 将所有扩展名为 mp4 的文件重命名/移动到它们的父目录,同时赋予它们与其包含文件夹相同的名称,2. 删除子文件夹的内容并查找其中的目录为空,然后rmdir, 3. rmdir 子文件夹。

                $handle = opendir("D:/Movies/");
                while ($file = readdir($handle)) {
                if ($file != "." && $file != ".." && is_dir($file)) {
                    $newhandle = opendir("D:/Movies/".$file);
                    while($newfile = readdir($newhandle)) {
                        if ($newfile != "." && $newfile != ".." && is_file("D:/Movies/".$file."/".$newfile)) {
                            $parts = explode(".",$newfile);
                            if (end($parts) == "mp4") {
                                if (!file_exists("D:/Movies/".$file.".mp4")) {
                                    rename("D:/Movies/".$file."/".$newfile,"D:/Movies/".$file.".mp4");
                                }
                                else {
                                    unlink("D:/Movies/".$file."/".$newfile);
                                }
                            }
                            else { unlink("D:/Movies/".$file."/".$newfile); }
                        }
                        else if ($newfile != "." && $newfile != ".." && is_dir("D:/Movies/".$file."/".$newfile)) {
                            $dirhandle = opendir("D:/Movies/".$file."/".$newfile);
                            while ($dirfile = readdir($dirhandle)){
                                if ($dirfile != "." && $dirfile != ".."){
                                    unlink("D:/Movies/".$file."/".$newfile."/".$dirfile);
                                }
                            }
                            rmdir("D:/Movies/".$file."/".$newfile);
                        }
                    }
                    unlink("D:/Movies/".$file);
                }
                }
                

                【讨论】:

                  【解决方案11】:

                  我用这个将我所有的 .json 文件从根文件夹移动到 json 文件夹

                  foreach (glob("*.json") as $filename) {
                      rename($filename,"json/".$filename);
                  }
                  

                  pd:有人 2020?

                  【讨论】:

                  • 这是问题还是答案?
                  猜你喜欢
                  • 1970-01-01
                  • 2011-04-24
                  • 1970-01-01
                  • 2022-08-10
                  • 1970-01-01
                  • 2011-02-14
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多