Php kullanarak başka bir dizinin tüm içeriğini kopyalamak

8 Cevap

Ben kullanarak başka bir yere dizinin tüm içeriğini kopyalamak için çalıştı

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

ama bu akımı, gerçek *.* bulunmazsa bulamadığını söylüyor.

Başka bir şekilde

Thanks Dave

8 Cevap

O kopya only işlemek görünüyor single files. İşte kopyalama için bir işlev özyinelemeli ben üzerinde bulunan bir 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); 
} 
?>

Burada da sembolik önemser başka bir yaklaşımdır:

/**
 * Copy a file, or recursively copy a folder and its contents
 * @param       string   $source    Source path
 * @param       string   $dest      Destination path
 * @param       string   $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");
    }

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

copy () sadece dosyaları ile çalışır.

DOS kopyalama ve Unix cp komutları Hem yinelemeli kopyalar - böylece hızlı çözüm ödemek ve bu kullanmak için sadece budur. örneğin

`cp -r $src $dest`;

Is_dir her döndürür true, aksi takdirde sonuçlarına boyunca yineleme, opendir / readdir veya scandir dizinin içeriğini okumak için kullanmanız gereken ve olacak bir, içine özyineleme.

örneğin

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

C.

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

Son 4. satırından, bu hale

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

ve

$destination ='b';

Gibi başka bir yerde dedi, copy sadece kaynak değil, bir model için tek bir dosya ile çalışır. Eğer desen kopyalamak kopyasını çalıştırmak sonra, glob dosyaları belirlemek için kullanmak istiyorsanız. Bu olsa alt dizinleri kopyalamak değil, ne de hedef dizini yaratacaktır.

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

En iyi çözüm!

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

My pruned version of @Kzoty answer. Thank you Kzoty.

Kullanım

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

}

Tam teşekkürler minnetle kodu kullanmış onun mükemmel cevap Felix Kling gitmek gerekir. Ben başarı veya başarısızlık rapor bir boolean dönüş değerinin küçük bir geliştirme sunuyoruz:

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 = recurseCopy($src . '/' . $file,$dst . '/' . $file); 
                } 
                else { 
                    $result = copy($src . '/' . $file,$dst . '/' . $file); 
                } 
            } 
        } 
        closedir($dir);
    }
}

return $result;
}