将文件夹中的所有文件移动到另一个?

问题描述 投票:28回答:10

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

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

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

rename('path/*', 'newpath/*');
php file
10个回答
55
投票

一个稍微冗长的解决方案:

// 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);
}

0
投票

不确定这是否对任何人有所帮助,但我还是认为我会发帖。有一个挑战,我有很多电影,我通过各种在线商店购买和下载所有存储在一个文件夹中,但都在他们自己的子文件夹中,并具有不同的命名约定。我想将它们全部移动到父文件夹中,并将它们重命名为看起来很漂亮。我设法使用批量重命名工具和条件名称格式重命名的所有子文件夹。子文件夹中有其他文件,我不想要。所以我写了下面的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);
}
}

15
投票

使用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";
}

12
投票

请尝试此解决方案,它已成功测试::

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

1
投票

所以我尝试使用所描述的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);

因此,当我再次运行代码时,它吐出两个路径都是目录。我很难过。我和一位同事谈过,他建议说:“为什么不将temp目录重命名为新目录,因为你还想移动所有文件?”

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

所以它看起来像这样。

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

rename($tempDir, $permanentDir);

这对我的目的很有效,因为我不需要旧的tmp目录在文件上传和“移动”后保留在那里。

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


1
投票

试过这个?:

     <?php

     $oldfolderpath = "old/folder";
     $newfolderpath = "new/folder";

     rename($oldfolderpath,$newfolderpath);
     ?>

1
投票

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

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);
}

0
投票

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

我没有看到在目的地有一个星号的意义


0
投票

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

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

0
投票

作为旁注;将文件复制到另一个文件夹时,它们的上次更改时间将成为当前时间戳。所以你应该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) ...
© www.soinside.com 2019 - 2024. All rights reserved.