Kopieren Sie den gesamten Inhalt eines Verzeichnisses mit PHP in ein anderes

Lesezeit: 6 Minuten

Kopieren Sie den gesamten Inhalt eines Verzeichnisses mit PHP in
dave

Ich habe versucht, den gesamten Inhalt des Verzeichnisses mit an einen anderen Ort zu kopieren

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

aber es sagt, dass es keinen Stream finden kann, wahr *.* wurde nicht gefunden.

Wie auch immer

Danke David

  • @die Redaktion: Bist du dir sicher? "old_location/." war nur ein Tippfehler?

    – Felix Klinge

    12. Januar 2010 um 17:26 Uhr


  • Rich Rodecker hat in seinem Blog ein Skript, das genau das zu tun scheint. sichtbares-form.com/blog/copy-directory-in-php

    – Jon F. Hancock

    12. Januar 2010 um 17:27 Uhr

  • @Felix: Das habe ich mich auch gefragt. Ich rollte zurück zur ersten Revision, aber es hat "old_location/*.*. Ich kann keine Revision finden, die enthält "old_location/.".

    – Asaf

    12. Januar 2010 um 17:29 Uhr

  • @Asaph: Dein Rollback war ok, schau dir den Verlauf an … meinte ich copy ("old_location/.","new_location/");

    – Felix Klinge

    12. Januar 2010 um 17:34 Uhr


  • @dave Wann holst du eine akzeptierte ab :)?

    – Name G VU

    10. Dezember 2011 um 20:00 Uhr

Kopieren Sie den gesamten Inhalt eines Verzeichnisses mit PHP in
Felix Klinge

das funktionierte für ein einstufiges Verzeichnis. Für einen Ordner mit mehrstufigen Verzeichnissen habe ich Folgendes verwendet:

function recurseCopy(
    string $sourceDirectory,
    string $destinationDirectory,
    string $childFolder=""
): void {
    $directory = opendir($sourceDirectory);

    if (is_dir($destinationDirectory) === false) {
        mkdir($destinationDirectory);
    }

    if ($childFolder !== '') {
        if (is_dir("$destinationDirectory/$childFolder") === false) {
            mkdir("$destinationDirectory/$childFolder");
        }

        while (($file = readdir($directory)) !== false) {
            if ($file === '.' || $file === '..') {
                continue;
            }

            if (is_dir("$sourceDirectory/$file") === true) {
                recurseCopy("$sourceDirectory/$file", "$destinationDirectory/$childFolder/$file");
            } else {
                copy("$sourceDirectory/$file", "$destinationDirectory/$childFolder/$file");
            }
        }

        closedir($directory);

        return;
    }

    while (($file = readdir($directory)) !== false) {
        if ($file === '.' || $file === '..') {
            continue;
        }

        if (is_dir("$sourceDirectory/$file") === true) {
            recurseCopy("$sourceDirectory/$file", "$destinationDirectory/$file");
        }
        else {
            copy("$sourceDirectory/$file", "$destinationDirectory/$file");
        }
    }

    closedir($directory);
}

  • Es ist ein Sternchen und kein Stern 😉

    – Gordon

    12. Januar 2010 um 17:26 Uhr

  • Funktioniert wie ein Zauber.. Danke @FelixKling

    – Milap

    12. Juni 2012 um 10:09 Uhr

  • Warum @mkdir anstatt mkdir ?

    – Oliboy50

    11. Juli 2014 um 9:10 Uhr

  • @Oliboy50: Sie können die Person fragen, die den Code vor 5 Jahren geschrieben hat: php.net/manual/en/function.copy.php#91010. Vielleicht war es damals populärer, Fehlermeldungen zu unterdrücken.

    – Felix Klinge

    11. Juli 2014 um 9:12 Uhr


  • @Oliboy50: Ich verstehe. Ich denke, es unterdrückt jede Fehlermeldung. Ich habe es aber nie wirklich benutzt. Dies ist die Dokumentation: us3.php.net/manual/en/language.operators.errorcontrol.php

    – Felix Klinge

    11. Juli 2014 um 9:18 Uhr


Kopieren Sie den gesamten Inhalt eines Verzeichnisses mit PHP in
itsjavi

Als hier beschriebendies ist ein weiterer Ansatz, der sich auch um Symlinks kümmert:

/**
 * 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)
{
    $sourceHash = hashDirectory($source);
    // 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
        if($sourceHash != hashDirectory($source."https://stackoverflow.com/".$entry)){
             xcopy("$source/$entry", "$dest/$entry", $permissions);
        }
    }

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

// In case of coping a directory inside itself, there is a need to hash check the directory otherwise and infinite loop of coping is generated

function hashDirectory($directory){
    if (! is_dir($directory)){ return false; }

    $files = array();
    $dir = dir($directory);

    while (false !== ($file = $dir->read())){
        if ($file != '.' and $file != '..') {
            if (is_dir($directory . "https://stackoverflow.com/" . $file)) { $files[] = hashDirectory($directory . "https://stackoverflow.com/" . $file); }
            else { $files[] = md5_file($directory . "https://stackoverflow.com/" . $file); }
        }
    }

    $dir->close();

    return md5(implode('', $files));
}

  • Hat super funktioniert, einen Ordner mit 140 Unterordnern zu kopieren und jeder Unterordner enthält 21 Bilder. Funktioniert super! Danke!

    – Darksaint2014

    18. September 2014 um 14:47 Uhr

  • mkdir sollte hinzugefügt werden true Als letzter Parameter zur Unterstützung des rekursiven Verzeichnisses ist dieses Skript perfekt

    – ZenitS

    22. Oktober 2018 um 3:46 Uhr


  • Dies kopiert den gesamten Ordner? Was ist, wenn Sie nur die Dateien kopieren möchten? Innerhalb der Ordner, ohne den übergeordneten Ordner, wie die Frage sagt: copy ("old_location/*.*","new_location/"); Funktioniert es? Was ist, wenn Sie Punktdateien haben, werden sie abgeglichen?

    – XCS

    14. Juli 2020 um 23:52 Uhr


1646181248 66 Kopieren Sie den gesamten Inhalt eines Verzeichnisses mit PHP in
Symbohne

copy() funktioniert nur mit Dateien.

Sowohl die DOS-Kopier- als auch die Unix-Befehle cp werden rekursiv kopiert – daher ist die schnellste Lösung, diese einfach zu berappen und zu verwenden. z.B

`cp -r $src $dest`;

Andernfalls müssen Sie die verwenden opendir/readdir oder scandir Um den Inhalt des Verzeichnisses zu lesen, durchlaufen Sie die Ergebnisse und wenn is_dir für jedes einzelne wahr zurückgibt, rekursiv hinein.

z.B

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

  • Hier ist eine stabilere und sauberere Version von xcopy(), die den Ordner nicht erstellt, wenn er existiert: function xcopy($src, $dest) { foreach (scandir($src) as $file) { $srcfile = rtrim($src, '/') .'/'. $file; $destfile = rtrim($dest, '/') .'/'. $file; if (!is_readable($srcfile)) { continue; } if ($file != '.' && $file != '..') { if (is_dir($srcfile)) { if (!file_exists($destfile)) { mkdir($destfile); } xcopy($srcfile, $destfile); } else { copy($srcfile, $destfile); } } } }

    – TheStoryCoder

    10. November 2013 um 10:03 Uhr


  • Danke für Backtick-Lösung! Eine Seite, die mir geholfen hat, den Kopierbefehl zu optimieren: UNIX cp erklärt. Zusätzliche Informationen: PHP >=5.3 bietet einige nette Iteratoren

    – maxpower9000

    6. November 2015 um 9:47 Uhr


1646181248 787 Kopieren Sie den gesamten Inhalt eines Verzeichnisses mit PHP in
Schwarz

Die beste Lösung ist!

<?php
$src = "https://stackoverflow.com/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
?>

1646181248 108 Kopieren Sie den gesamten Inhalt eines Verzeichnisses mit PHP in
Hähnchenchili

Mit Symfony ist dies sehr einfach zu bewerkstelligen:

$fileSystem = new Symfony\Component\Filesystem\Filesystem();
$fileSystem->mirror($from, $to);

Sehen https://symfony.com/doc/current/components/filesystem.html

1646181249 594 Kopieren Sie den gesamten Inhalt eines Verzeichnisses mit PHP in
Herr Zauberer

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 . "https://stackoverflow.com/" . $entry; 
            if ( is_dir( $Entry ) ) {
                full_copy( $Entry, $target . "https://stackoverflow.com/" . $entry );
                continue;
            }
            copy( $Entry, $target . "https://stackoverflow.com/" . $entry );
        }

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

1646181250 611 Kopieren Sie den gesamten Inhalt eines Verzeichnisses mit PHP in
Gordon

Wie schon an anderer Stelle gesagt, copy funktioniert nur mit einer einzigen Datei als Quelle und nicht mit einem Muster. Wenn Sie nach Muster kopieren möchten, verwenden Sie glob um die Dateien zu ermitteln, führen Sie dann copy aus. Dadurch werden jedoch weder Unterverzeichnisse kopiert noch das Zielverzeichnis erstellt.

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

  • erwägen Sie eine Änderung: $dest = realpath($dir . DIRECTORY_SEPARATOR) . Basisname($Datei); mit: $dest = realpath($dir ) . DIRECTORY_SEPARATOR . Basisname($Datei);

    – dawez

    19. März 2013 um 10:34 Uhr


906490cookie-checkKopieren Sie den gesamten Inhalt eines Verzeichnisses mit PHP in ein anderes

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy