У меня есть каталог под названием «mysourcedir», у которого есть файлы и папки sonme. поэтому я хочу скопировать весь контент из этого каталога в другую «папку назначения» на сервере Linux с помощью PHP.
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 ) ) { $this->full_copy( $Entry, $target . '/' . $entry ); continue; } copy( $Entry, $target . '/' . $entry ); } $d->close(); }else { copy( $source, $target ); } }
Я пытаюсь этот код, но он создает некоторую проблему, он создает каталог «mysourcedir» в месте назначения. Я ожидаю, что просто скопирую все файлы и папки в пункт назначения. Пожалуйста, предложите
Привет, небольшие разработчики php, это не вопрос, а ответ на вопрос о том, как копировать файлы из одной папки в другую. Я столкнулся через Интернет, что некоторые разработчики используют rename () вместо copy () для перемещения файлов из одного каталога в другой. Вот простой рабочий код. Протестировано и работает как шарм.
<=========================== Волшебство ===================== ========>
<?php $dir = "path/to/targetFiles/"; $dirNew="path/to/newFilesFolder/"; // Open a known directory, and proceed to read its contents if (is_dir($dir)) { if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { //exclude unwanted if ($file==".") continue; if ($file=="..")continue; //if ($file=="index.php") continue; for example if you have index.php in the folder if (copy("$dir/$file","$dirNew/$file")) { echo "Files Copyed Successfully"; //echo "<img src=$dirNew/$file />"; //if files you are moving are images you can print it from //new folder to be sure they are there } else {echo "File Not Copy";} } closedir($dh); } } ?>
class FolderCopy { public static function copyFolder($src, $dest) { $path = realpath($src); $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST); /** SplFileInfo $object*/ foreach($objects as $name => $object) { $startsAt = substr(dirname($name), strlen($src)); self::mkDir($dest.$startsAt); if(is_writable($dest.$startsAt) and $object->isFile()) { copy((string)$name, $dest.$startsAt.DIRECTORY_SEPARATOR.basename($name)); } } } private static function mkDir($folder, $perm=0777) { if(!is_dir($folder)) { mkdir($folder, $perm); } } }
FolderCopy :: copyFolder (dirname (dirname ( FILE )). "/ Images", dirname ( FILE ). "/ Test");
Это мое предложение.
<?php /** * Copy a file, or recursively copy a folder and its contents * * @author Aidan Lister <aidan@php.net> * @version 1.0.1 * @param string $source Source path * @param string $dest Destination path * @return bool Returns TRUE on success, FALSE on failure */ function copyr($source, $dest) { // Simple copy for a file if (is_file($source)) { chmod($dest, 777); return copy($source, $dest); } // Make destination directory if (!is_dir($dest)) { mkdir($dest); } chmod($dest, 777); // Loop through the folder $dir = dir($source); while (false !== $entry = $dir->read()) { // Skip pointers if ($entry == '.' || $entry == '..') { continue; } // Deep copy directories if ($dest !== "$source/$entry") { copyr("$source/$entry", "$dest/$entry"); } } // Clean up $dir->close(); return true; } ?>
Вы, вероятно, просто хотите переместить эту строку вниз, например:
function full_copy( $source, $target ) { if ( is_dir( $source ) ) { $d = dir( $source ); while ( FALSE !== ( $entry = $d->read() ) ) { if ( $entry == '.' || $entry == '..' ) { continue; } $Entry = $source . '/' . $entry; if ( is_dir( $Entry ) ) { @mkdir( $Entry ); $this->full_copy( $Entry, $target . '/' . $entry ); continue; } copy( $Entry, $target . '/' . $entry ); } $d->close(); }else { copy( $source, $target ); }
Хотя лично я бы избегал использовать 2 переменные с тем же именем, только для того, чтобы их отличить. Просмотрите комментарии пользователей на http://www.php.net/copy для других возможностей.
Я думаю, что $ d-> read () вернет также имя родителя и шляпу, поэтому вы создаете его снова в целевом каталоге.
попробуйте запустить cp -a. Это заботится о сохранении модов и разрешений, и все такое. cp -al
сделает ферму жестких ссылок.
для сервера Windows:
shell_exec('xcopy \\old\\folder \\new\\folder /s /e /y /i');
для сервера linux:
shell_exec('cp -R /old/folder /new/folder');