2010-01-12 194 views
107

我試圖將目錄中的全部內容複製到使用目錄的全部內容複製到另一個使用PHP

copy ("old_location/*.*","new_location/"); 

其它位置,但它說,它無法找到流,真正*.*找不到。

任何其他方式

感謝 戴夫

+1

@the editors:你確定''old_location /。「'只是一個錯字嗎? – 2010-01-12 17:26:23

+0

@Felix:我在想同樣的事情。我回滾到第一個修訂版,但它有''old_location /*.*',我找不到包含''old_location /。''的修訂版。 – Asaph 2010-01-12 17:29:57

+0

@Asaph:你的回滾是好的,看看歷史.. 。我的意思是copy(「old_location /。」,「new_location /」);' – 2010-01-12 17:34:59

回答

191

似乎複製只有手柄單個文件。下面是遞歸複製功能我this note發現了copy documentation page:)

<?php 
function recurse_copy($src,$dst) { 
    $dir = opendir($src); 
    @mkdir($dst); 
    while(false !== ($file = readdir($dir))) { 
     if (($file != '.') && ($file != '..')) { 
      if (is_dir($src . '/' . $file)) { 
       recurse_copy($src . '/' . $file,$dst . '/' . $file); 
      } 
      else { 
       copy($src . '/' . $file,$dst . '/' . $file); 
      } 
     } 
    } 
    closedir($dir); 
} 
?> 
+2

這是一個星號,而不是一個星號;) – Gordon 2010-01-12 17:26:07

+1

Uups :-)但是我不得不編輯;) – 2010-01-12 17:27:44

+5

工程就像一個魅力..謝謝@FelixKling – Milap 2012-06-12 10:09:45

26

複印件(僅適用於文件。

DOS拷貝和Unix cp命令都會遞歸地拷貝 - 所以最快的解決方案就是放棄並使用它們。例如

`cp -r $src $dest`; 

否則,你就需要使用opendir/readdirscandir讀取目錄的內容,遍歷這些結果,如果is_dir爲每一個返回true,遞歸到它。

例如

function xcopy($src, $dest) { 
    foreach (scandir($src) as $file) { 
     if (!is_readable($src . '/' . $file)) continue; 
     if (is_dir($src .'/' . $file) && ($file != '.') && ($file != '..')) { 
      mkdir($dest . '/' . $file); 
      xcopy($src . '/' . $file, $dest . '/' . $file); 
     } else { 
      copy($src . '/' . $file, $dest . '/' . $file); 
     } 
    } 
} 
+1

這是XCOPY的)更穩定和更清潔的版本(如果存在不創建文件夾: '函數XCOPY($ SRC,$ DEST){ \t的foreach(SCANDIR($ SRC)爲$文件){ \t \t $ srcfile = rtrim($ src,'/')。'/'。 $文件; \t \t $ destfile = rtrim($ dest,'/')。'/'。 $文件; \t \t if(!is_readable($ srcfile)){ \t \t \t繼續; \t \t} \t \t如果($文件!= '' && $文件!= '..'){ \t \t \t如果(is_dir($ SRCFILE)){ \t \t \t \t如果(!file_exists($ destfile)){ \t \t \t \t \t MKDIR($ destfile); \t \t \t \t} \t \t \t \t XCOPY($ SRCFILE,$ destfile); \t \t \t}其他{ \t \t \t \t副本($ SRCFILE,$ destfile); \t \t \t} \t \t} \t} }' – TheStoryCoder 2013-11-10 10:03:12

+0

感謝**反引號解決方案**!一個幫助我調整複製命令的頁面:[UNIX cp解釋](http://www.computerhope.com/unix/ucp.htm)。附加信息:PHP> = 5.3提供了一些不錯的[iterators](http://de2.php.net/manual/en/class.recursivedirectoryiterator.php) – maxpower9000 2015-11-06 09:47:41

7

就像其他地方說的那樣,copy只適用於源文件而不是模式文件。如果要按模式複製,請使用glob確定文件,然後運行復制。這不會複製子目錄,也不會創建目標目錄。

function copyToDir($pattern, $dir) 
{ 
    foreach (glob($pattern) as $file) { 
     if(!is_dir($file) && is_readable($file)) { 
      $dest = realpath($dir . DIRECTORY_SEPARATOR) . basename($file); 
      copy($file, $dest); 
     } 
    }  
} 
copyToDir('./test/foo/*.txt', './test/bar'); // copies all txt files 
+0

考慮更改: $ dest = realpath($ dir。DIRECTORY_SEPARATOR)。基名($文件); 與: $ dest = realpath($ dir)。 DIRECTORY_SEPARATOR。基名($文件); – dawez 2013-03-19 10:34:42

16

最好的解決方案是!

<?php 
$src = "/home/www/domain-name.com/source/folders/123456"; 
$dest = "/home/www/domain-name.com/test/123456"; 

shell_exec("cp -r $src $dest"); 

echo "<H3>Copy Paste completed!</H3>"; //output when done 
?> 
+28

在Windows服務器或其他您無法訪問'shell_exec'或'cp'的環境中無法使用。這使得它 - 在我看來 - 幾乎不是「最好」的解決方案。 – 2012-08-02 14:21:59

+3

除此之外,當有人找到一種方法在服務器上獲取文件時,來自PHP文件的命令行控件可能是一個大問題。 – Martijn 2014-02-21 13:41:36

+0

工作就像一個魅力!在CentOS上它運行得非常好。謝謝@bstpierre – 2016-10-12 07:50:39

12
function full_copy($source, $target) { 
    if (is_dir($source)) { 
     @mkdir($target); 
     $d = dir($source); 
     while (FALSE !== ($entry = $d->read())) { 
      if ($entry == '.' || $entry == '..') { 
       continue; 
      } 
      $Entry = $source . '/' . $entry; 
      if (is_dir($Entry)) { 
       full_copy($Entry, $target . '/' . $entry); 
       continue; 
      } 
      copy($Entry, $target . '/' . $entry); 
     } 

     $d->close(); 
    }else { 
     copy($source, $target); 
    } 
} 
+0

完美的作品!非常感謝bro – 2016-04-30 12:53:30

5

我修剪@Kzoty答案的版本。 謝謝Kzoty。

使用

Helper::copy($sourcePath, $targetPath); 

class Helper { 

    static function copy($source, $target) { 
     if (!is_dir($source)) {//it is a file, do a normal copy 
      copy($source, $target); 
      return; 
     } 

     //it is a folder, copy its files & sub-folders 
     @mkdir($target); 
     $d = dir($source); 
     $navFolders = array('.', '..'); 
     while (false !== ($fileEntry=$d->read())) {//copy one by one 
      //skip if it is navigation folder . or .. 
      if (in_array($fileEntry, $navFolders)) { 
       continue; 
      } 

      //do copy 
      $s = "$source/$fileEntry"; 
      $t = "$target/$fileEntry"; 
      self::copy($s, $t); 
     } 
     $d->close(); 
    } 

} 
74

由於described here,這是另一種方法是需要照顧的符號鏈接過多:

/** 
* Copy a file, or recursively copy a folder and its contents 
* @author  Aidan Lister <[email protected]> 
* @version  1.0.1 
* @link  http://aidanlister.com/2004/04/recursively-copying-directories-in-php/ 
* @param  string $source Source path 
* @param  string $dest  Destination path 
* @param  int  $permissions New folder creation permissions 
* @return  bool  Returns true on success, false on failure 
*/ 
function xcopy($source, $dest, $permissions = 0755) 
{ 
    // Check for symlinks 
    if (is_link($source)) { 
     return symlink(readlink($source), $dest); 
    } 

    // Simple copy for a file 
    if (is_file($source)) { 
     return copy($source, $dest); 
    } 

    // Make destination directory 
    if (!is_dir($dest)) { 
     mkdir($dest, $permissions); 
    } 

    // Loop through the folder 
    $dir = dir($source); 
    while (false !== $entry = $dir->read()) { 
     // Skip pointers 
     if ($entry == '.' || $entry == '..') { 
      continue; 
     } 

     // Deep copy directories 
     xcopy("$source/$entry", "$dest/$entry", $permissions); 
    } 

    // Clean up 
    $dir->close(); 
    return true; 
} 
+0

評論,緊湊,加上功能...好! n__n – AgelessEssence 2013-02-01 23:29:11

+0

非常適合複製包含140個子文件夾和每個包含21個圖像的子文件夾的文件夾。很棒!謝謝! – Darksaint2014 2014-09-18 14:47:05

6

充滿感激必須去費利克斯·克林爲他,我已經感激地使用優秀的答案我的代碼。我提供了一個布爾返回值的小改進報告成功或失敗:從過去的4號線

function recurse_copy($src, $dst) { 

    $dir = opendir($src); 
    $result = ($dir === false ? false : true); 

    if ($result !== false) { 
    $result = @mkdir($dst); 

    if ($result === true) { 
     while(false !== ($file = readdir($dir))) { 
     if (($file != '.') && ($file != '..') && $result) { 
      if (is_dir($src . '/' . $file)) { 
      $result = recurse_copy($src . '/' . $file,$dst . '/' . $file); 
      }  else { 
      $result = copy($src . '/' . $file,$dst . '/' . $file); 
      } 
     } 
     } 
     closedir($dir); 
    } 
    } 

    return $result; 
} 
+1

您正在使用recurse_copy()和recurseCopy()作爲函數名稱,對其進行更新。 – AgelessEssence 2013-02-01 23:27:38

+0

closedir($ dir);語句需要超出if($ reslut === true)語句,即進一步向下的一個大括號。否則,您有可能無法獲得資源。 – 2016-01-23 19:25:16

8
<?php 
    function copy_directory($source, $destination) { 
     if (is_dir($source)) { 
     @mkdir($destination); 
     $directory = dir($source); 
     while (FALSE !== ($readdirectory = $directory->read())) { 
      if ($readdirectory == '.' || $readdirectory == '..') { 
       continue; 
      } 
      $PathDir = $source . '/' . $readdirectory; 
      if (is_dir($PathDir)) { 
       copy_directory($PathDir, $destination . '/' . $readdirectory); 
       continue; 
      } 
      copy($PathDir, $destination . '/' . $readdirectory); 
     } 

     $directory->close(); 
     }else { 
     copy($source, $destination); 
     } 
    } 
?> 

,使這個

$source = 'wordpress';//i.e. your source path 

$destination ='b'; 
+0

這隻適用於Windows系統嗎? – 2013-03-22 04:15:59

0

我通過SPL Directory Iterator克隆整個目錄。

function recursiveCopy($source, $destination) 
{ 
    if (!file_exists($destination)) { 
     mkdir($destination); 
    } 

    $splFileInfoArr = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST); 

    foreach ($splFileInfoArr as $fullPath => $splFileinfo) { 
     //skip . .. 
     if (in_array($splFileinfo->getBasename(), [".", ".."])) { 
      continue; 
     } 
     //get relative path of source file or folder 
     $path = str_replace($source, "", $splFileinfo->getPathname()); 

     if ($splFileinfo->isDir()) { 
      mkdir($destination . "/" . $path); 
     } else { 
     copy($fullPath, $destination . "/" . $path); 
     } 
    } 
} 
#calling the function 
recursiveCopy(__DIR__ . "/source", __DIR__ . "/destination"); 
相關問題