我試圖將目錄中的全部內容複製到使用目錄的全部內容複製到另一個使用PHP
copy ("old_location/*.*","new_location/");
其它位置,但它說,它無法找到流,真正*.*
找不到。
任何其他方式
感謝 戴夫
我試圖將目錄中的全部內容複製到使用目錄的全部內容複製到另一個使用PHP
copy ("old_location/*.*","new_location/");
其它位置,但它說,它無法找到流,真正*.*
找不到。
任何其他方式
感謝 戴夫
似乎複製只有手柄單個文件。下面是遞歸複製功能我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);
}
?>
複印件(僅適用於文件。
DOS拷貝和Unix cp命令都會遞歸地拷貝 - 所以最快的解決方案就是放棄並使用它們。例如
`cp -r $src $dest`;
否則,你就需要使用opendir
/readdir
或scandir
讀取目錄的內容,遍歷這些結果,如果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);
}
}
}
這是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
感謝**反引號解決方案**!一個幫助我調整複製命令的頁面:[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
就像其他地方說的那樣,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
考慮更改: $ dest = realpath($ dir。DIRECTORY_SEPARATOR)。基名($文件); 與: $ dest = realpath($ dir)。 DIRECTORY_SEPARATOR。基名($文件); – dawez 2013-03-19 10:34:42
最好的解決方案是!
<?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
?>
在Windows服務器或其他您無法訪問'shell_exec'或'cp'的環境中無法使用。這使得它 - 在我看來 - 幾乎不是「最好」的解決方案。 – 2012-08-02 14:21:59
除此之外,當有人找到一種方法在服務器上獲取文件時,來自PHP文件的命令行控件可能是一個大問題。 – Martijn 2014-02-21 13:41:36
工作就像一個魅力!在CentOS上它運行得非常好。謝謝@bstpierre – 2016-10-12 07:50:39
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);
}
}
完美的作品!非常感謝bro – 2016-04-30 12:53:30
我修剪@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();
}
}
由於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;
}
評論,緊湊,加上功能...好! n__n – AgelessEssence 2013-02-01 23:29:11
非常適合複製包含140個子文件夾和每個包含21個圖像的子文件夾的文件夾。很棒!謝謝! – Darksaint2014 2014-09-18 14:47:05
充滿感激必須去費利克斯·克林爲他,我已經感激地使用優秀的答案我的代碼。我提供了一個布爾返回值的小改進報告成功或失敗:從過去的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;
}
您正在使用recurse_copy()和recurseCopy()作爲函數名稱,對其進行更新。 – AgelessEssence 2013-02-01 23:27:38
closedir($ dir);語句需要超出if($ reslut === true)語句,即進一步向下的一個大括號。否則,您有可能無法獲得資源。 – 2016-01-23 19:25:16
<?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';
這隻適用於Windows系統嗎? – 2013-03-22 04:15:59
我通過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");
@the editors:你確定''old_location /。「'只是一個錯字嗎? – 2010-01-12 17:26:23
@Felix:我在想同樣的事情。我回滾到第一個修訂版,但它有''old_location /*.*',我找不到包含''old_location /。''的修訂版。 – Asaph 2010-01-12 17:29:57
@Asaph:你的回滾是好的,看看歷史.. 。我的意思是copy(「old_location /。」,「new_location /」);' – 2010-01-12 17:34:59