Ankündigung

Einklappen
Keine Ankündigung bisher.

Kopierscript

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Kopierscript

    Hallo,

    ich habe hier ein Skript, das Dateien kopieren kann. Leider kopiert es erst die Dateien der Unterordner und dann die Unterordner, was natürlich in einer Fehlermeldung resultiert. Wie kann ich dieses Skript so verändern, dass es erst die Ordner und Dann die Dateien kopiert?

    PHP-Code:
    <?php
    // copydirr.inc.php
    /*
    26.07.2005
    Author: Anton Makarenko
       makarenkoa at ukrpost dot net
       webmaster at eufimb dot edu dot ua
    */
    function copydirr($fromDir,$toDir,$chmod=0757,$verbose=false)
    /*
       copies everything from directory $fromDir to directory $toDir
       and sets up files mode $chmod
    */
    {
    //* Check for some errors
    $errors=array();
    $messages=array();
    if (!
    is_writable($toDir))
       
    $errors[]='target '.$toDir.' is not writable';
    if (!
    is_dir($toDir))
       
    $errors[]='target '.$toDir.' is not a directory';
    if (!
    is_dir($fromDir))
       
    $errors[]='source '.$fromDir.' is not a directory';
    if (!empty(
    $errors))
       {
       if (
    $verbose)
           foreach(
    $errors as $err)
               echo 
    '[b]Error[/b]: '.$err.'
    '
    ;
       return 
    false;
       }
    //*/
    $exceptions=array('.','..');
    //* Processing
    $handle=opendir($fromDir);
    while (
    false!==($item=readdir($handle)))
       if (!
    in_array($item,$exceptions))
           {
           
    //* cleanup for trailing slashes in directories destinations
           
    $from=str_replace('//','/',$fromDir.'/'.$item);
           
    $to=str_replace('//','/',$toDir.'/'.$item);
           
    //*/
           
    if (is_file($from))
               {
               if (@
    copy($from,$to))
                   {
                   
    chmod($to,$chmod);
                   
    touch($to,filemtime($from)); // to track last modified time
                   
    $messages[]='File copied from '.$from.' to '.$to;
                   }
               else
                   
    $errors[]='cannot copy file from '.$from.' to '.$to;
               }
           if (
    is_dir($from))
               {
               if (@
    mkdir($to))
                   {
                   
    chmod($to,$chmod);
                   
    $messages[]='Directory created: '.$to;
                   }
               else
                   
    $errors[]='cannot create directory '.$to;
               
    copydirr($from,$to,$chmod,$verbose);
               }
           }
    closedir($handle);
    //*/
    //* Output
    if ($verbose)
       {
       foreach(
    $errors as $err)
           echo 
    '[b]Error[/b]: '.$err.'
    '
    ;
       foreach(
    $messages as $msg)
           echo 
    $msg.'
    '
    ;
       }
    //*/
    return true;
    }
    /* sample usage:
    WARNING:
    if You set wrong $chmod then You'll not be able to access files and directories
    in destination directory.
    For example: once upon a time I've called the function with parameters:
    copydir($fromDir,$toDir,true);
    What happened? I've forgotten one parameter (chmod)
    What happened next? Those files and directories became inaccessible for me
    (they had mode 0001), so I had to ask sysadmin to delete them from root account
    Be careful :-)
    <?php
    require('./copydirr.inc.php');
    copydirr('./testSRC','D:/srv/Apache2/htdocs/testDEST',0777,true);
    ?>
    */

    copydirr("testdir","testdir2",0777,true);

    ?>

  • #2
    Das ist doch das Beispiel ausm Manual bei der Funktion "copy".
    Das müsste doch eigentlich auch so gehen. Hast du irgendwas dran geändert?

    Kommentar


    • #3
      Re: Kopierscript

      Zitat von nh2
      Leider kopiert es erst die Dateien der Unterordner und dann die Unterordner
      Nein das tut es nicht! Erst wird mkdir() und dann copydirr() aufgerufen!

      Ich würde einfach mal die Behauptung aufstellen der Ordner testdir2 existiert nicht. Habe ich Recht?

      Kommentar


      • #4
        @Zergling: Geändert hab ich glaubich nix.

        @karl-150
        Testdir2 ist doch einer der Ordner, die das Script kopieren soll! Und darin befindet sich halt die Datei.

        Kommentar


        • #5
          Ist es denn so schwer die dreizeilige Funktionsbeschreibung zu lesen...

          Zitat von http://php.net/copy#55130
          A function that copies contents ((ja, tatsächlich nur den Inhalt)) of source directory ((selbiges hast du mit testdir betitelt)) to destination directory ((dein testskript2)) and sets up file modes.
          It may be handy to install the whole site on hosting.
          /edit:
          Zitat von nh2
          @Zergling: Geändert hab ich glaubich nix.
          Folglich tut das Skript also genau was es soll!

          Oder meinst Du niemand hätte - innnerhalb von beinahe einem halben Jahr - in einem Beitrag, veröffentlicht in DEM php-Manual, Dein gefundenes Fehlverhalten korrigiert/beanstandet.


          Zitat von nh2
          @karl-150
          Testdir2 ist doch einer der Ordner, die das Script kopieren soll! Und darin befindet sich halt die Datei.
          Was wollen?

          Kommentar


          • #6
            Ich habe die Beschreibung gelesen.
            Ich erkläre nochmal genau mein Problem.

            Ich habe 2 Ordner, testdir und testdir2.
            Alle Dateien und Ordner aus testdir sollen in testdir2 kopiert werden.
            In testdir befinden sich eine Datei "DateiImOrdner.txt" sowie ein "unterorder1", der die "DateiImUnterordner.txt" beinhaltet.

            Nach Skriptaufruf kommt folgende Meldung:

            Error: cannot copy file from testdir/unterordner1/DateiImUnterordner.txt to testdir2/unterordner1/DateiImUnterordner.txt
            Directory created: testdir2/unterordner1
            File copied from testdir/DateiImOrdner.txt to testdir2/DateiImOrdner.txt

            Meiner Meinung nach will das Skript erst "DateiImUnterordner.txt" kopieren, dann "unterorder1" und am Schluss "DateiImOrdner.txt".
            Als Reihenfolge also:
            -DateiImUnterordner
            -unterorder1
            -DateiImOrdner

            Das ganze würde doch funktionieren, wenn es so abliefe:
            -unterorder1
            -DateiImUnterordner
            -DateiImOrdner

            Sehe ich das falsch? Wenn nein, wie kann ich das so verändern?

            Kommentar


            • #7
              Zitat von nh2
              Sehe ich das falsch?
              Ja! Die Reihenfolge kommt nur dadurch zustande, dass erst die Fehler- und dann die Benachrichtungsmeldungen ausgegeben werden.

              Lass Dir mal die Originalfehlermeldungen ausgeben (@ entfernen, error_reporting(E_ALL)). Das lüftet hoffentlich das Geheimnis...

              Kommentar


              • #8
                Hey, du hast Recht. Aber wie kann ich diese blöde SafeMode-Meldung umgehen (Ausschalten geht nicht):

                Warning: copy(): SAFE MODE Restriction in effect. The script whose uid is 851 is not allowed to access /srv/www/htdocs/web116/html/data/ziptest2/testdir2/unterordner1 owned by uid 30 in /srv/www/htdocs/web116/html/data/ziptest2/copydir.php on line 44

                Warning: copy(testdir2/unterordner1/DateiImUnterordner.txt): failed to open stream: No such file or directory in /srv/www/htdocs/web116/html/data/ziptest2/copydir.php on line 44
                Error: cannot copy file from testdir/unterordner1/DateiImUnterordner.txt to testdir2/unterordner1/DateiImUnterordner.txt
                Directory created: testdir2/unterordner1
                File copied from testdir/DateiImOrdner.txt to testdir2/DateiImOrdner.txt

                Kommentar


                • #9
                  Zitat von nh2
                  Hey, du hast Recht. Aber wie kann ich diese blöde SafeMode-Meldung umgehen (Ausschalten geht nicht):.txt to testdir2/DateiImOrdner.txt
                  ...andere funktionen benutzen - zum lesen z.b. fread()

                  Kommentar


                  • #10
                    Wie muss ich das denn mit fread() in diesem Skript machen?

                    Noch eine andere Frage:
                    Beim Kopieren kriegt unterordner1 ja die UID 30 (wahrscheinlich vom Server erstellt, oder?). Wie kann ich denn in dem Skript festlegen, das die erstellten Ordner die selbe UID kriegen wie das Skript? Das müsste das Problem doch auch lösen.

                    Kommentar

                    Lädt...
                    X