2010-01-17 267 views
25

移动从一个位置的一个文件时,另一个我使用将文件夹中的所有文件移动到另一个文件夹中?

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

你如何将所有文件的文件夹中到另一个文件夹?想这一个没有结果:

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

你需要保持原来的目录? – Sampson 2010-01-17 18:48:28

+0

这将是很好的保持原来的文件夹...不是这次,但也许另一次我将不得不保留它..我可以怀疑你的方法是=) – ajsie 2010-01-17 18:49:33

+0

但我注意到我的目标文件夹中的文件,我想保持。然后你的方法不起作用,因为它不允许将文件夹移动到已经包含文件的目标文件夹 – ajsie 2010-01-17 18:55:04

回答

52

稍微详细的解决方案:

// 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

我有目标文件夹中的文件,我想保留它们。只需将文件从临时文件夹移动到该文件夹​​,以便始终添加文件。 – ajsie 2010-01-17 18:54:15

+0

我没有得到该行:if(in_array($ file,array(“。”,“..”)))continue;它在做什么? – ajsie 2010-01-17 20:11:30

+0

Noname,这个数组中的两个项目将是“。”代表“当前”目录,而“..”代表“前一个”目录。当我们遇到这些时,我们只是“继续”,这意味着我们跳过当前的迭代。 – Sampson 2010-01-17 20:16:36

0

尝试: 重命名( '路径/ *', 'NEWPATH /');使用重命名

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

没有工作..“没有这样的文件或目录” – ajsie 2010-01-17 18:53:24

0

有星号如果目标目录不存在,您需要先创建()和一些错误检查:

$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"; 
} 
+0

“没有这样的文件或目录” – Alvin 2011-06-15 21:20:06

+1

如果你有问题,张贴一些代码(或一个新的问题)。 – 2011-06-16 09:42:19

+0

这个答案对我无效。如果重命名函数支持globs,但是从PHP7开始看起来并不是这样,那将会很棒。例如:'rename(/home/eric/wordpress/files/.tmp-checksum/*,/ home/eric/wordpress/files/core):没有这样的文件或目录' 但是,运行'ls/home/eric/wordpress/files/.tmp-checksum/*在bash shell中确实显示很多文件。 – Eric 2017-11-06 03:10:12

15

另一种:

我没有看到一个点在目的地

1

于是,我所描述的使用rename()功能,我一直得到错误背面,有no such file or directory。我将代码放在if语句中,以确保我确实拥有创建的目录。它是这样的:

$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()将临时目录重命名为永久性目录。

所以它看起来像这样。

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

rename($tempDir, $permanentDir); 

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

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

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) ... 
1

尝试这一个?:

 <?php 

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

    rename($oldfolderpath,$newfolderpath); 
    ?> 
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); 
} 
} 
11

请尝试此解决方案,它的试验成功::

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