Teil von  SELFPHP
Professional CronJob-Service

Suche

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: SELFPHP Forum ::

Fragen rund um die Themen PHP?
In über 130.000 Beiträgen finden Sie sicher die passende Antwort!  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 
 
Dateien inkl. Unterverzeichnissen kopieren

Am Ende der Seite finden Sie das komplette Beispiel als Download.

Systemvoraussetzung

  • Linux
  • Windows
  • PHP 3
  • PHP 4
  • PHP 5

Datei(en)

copy_folder.php

Problem


Sie kennen sicher das Problem: Sie möchten z. B. gerne Ihr aktuelles Forum updaten, das alte Forum aber zur Sicherheit irgendwo speichern, sodass man auf diese Dateien eventuell wieder zugreifen kann. Wir werden nachfolgend ein Programm erklären, das genau diese Aufgabe erledigt.

Auf Wunsch können Sie entweder nur ein Verzeichnis oder rekursiv auch alle Unterverzeichnisse kopieren. Darüber hinaus soll das Programm die Menge der kopierten Dateien, sowie die Gesamtgröße der Dateien formatiert ausgeben.


Lösung

Die Lösung zu diesem Problem besteht aus einer rekursiven Funktion, die alle Verzeichnisse durchläuft und die Dateien in den Zielordner kopiert. Sollte das Verzeichnis, in dem die Datei liegt, in dem Zielordner nicht existieren, wird das Verzeichnis erstellt.

function copyFolder($source, $dest, &$statsCopyFolder, $recursive = false)
   @param   string   $source
   @param   string   $dest
   @param   array   &$statsCopyFolder
   @param   bool     $recursive
   @return   bool

Die Funktion copyFolder() erwartet als Parameter das zu kopierende Verzeichnis ($source), das Zielverzeichnis ($dest) und den optionalen Parameter $recursive („TRUE“) – auch Unterverzeichnisse werden kopiert.

Wir müssen im ersten Schritt überprüfen, ob das gerade durchsuchte Verzeichnis bereits im Zielverzeichnis existiert (38). Falls nicht, erstellen (40) wir dieses Verzeichnis im Zielverzeichnis, sodass später dort unsere Dateien hineinkopiert werden können.

Nach Aufruf von copyFolder() durchläuft die Funktion das aktuelle Verzeichnis (48). Jedes Verzeichnis beginnt immer mit einem . (Punkt) und einem .. (Punkt Punkt), die auch als „Dateien“ eingelesen werden. Sollte unsere Funktion diese beide Pseudodateien finden (56), so bricht sie den aktuellen Schleifendurchlauf (52) ab und fährt mit der nächsten Datei oder dem nächsten Verzeichnis fort.

Sollten Sie bei der Parameterangabe der Funktion (35) $recursive=FALSE gesetzt haben, so werden keine Unterverzeichnisse kopiert. Die Überprüfung (55) hierfür findet dann ebenfalls in dem Schleifendurchlauf statt. Findet die Funktion im aktuellen Verzeichnis ein weiteres Unterverzeichnis (57), ruft sie sich mit dem Pfad zum Unterverzeichnis als Parameter erneut auf (35) und durchläuft dann das Unterverzeichnis.

Findet die Funktion eine Datei (66), so wird diese Datei in den Zielordner kopiert (68). Zusätzlich wird die Array-Variable für die kopierte Dateimenge erhöht (69) und die Dateigröße ebenfalls in dieser Array-Variablen addiert (70). Da dieses Array als Referenz vorliegt, sind die geänderten Werte bereits außerhalb der Funktion bekannt und müssen nicht explizit zurückgegeben werden.

035:

036:
037:
038:
039:
040:
041:
042:
043:
044:
045:
046:
047:
048:
049:
050:
051:
052:
053:
054:
055:
056:
057:
058:
059:
060:
061:
062:
063:

064:
065:
066:
067:
068:
069:
070:
071:
072:
073:
074:
075:
076:
function copyFolder($source$dest, &$statsCopyFolder
    $recursive 
false)
{

    if (!
is_dir($dest)) 
    { 
        
mkdir($dest); 
  } 
 
    
$handle = @opendir($source);
    
    if(!
$handle)
        return 
false;
    
    while (
$file = @readdir ($handle))
    {
        if (
eregi("^\.{1,2}$",$file))
        {
            continue;
        }
        
        if(!
$recursive && $source != $source.$file."/")
        {
            if(
is_dir($source.$file))
                continue;
        }
        
        if(
is_dir($source.$file))
        {
            
copyFolder($source.$file."/"$dest.$file."/"
                $statsCopyFolder
, $recursive);
            
        }
        else
        {
            
copy($source.$file$dest.$file);
            
$statsCopyFolder['files']++;
            
$statsCopyFolder['bytes'] += filesize($source.$file); 
        }
    }

    @
closedir($handle);
    
}
Beispiel 6.10: copy_folder.php

function binary_multiples($size, $praefix=true, $short= true)
   @param   integer   $size
   @param   bool       $praefix
   @param   bool       $short
   @return   float       $size

Diese Funktion wurde bereits im Unterkapitel "Umrechnung Byte/Kilobyte/Megabyte – Byte/Kibibyte/Mebibyte" ausreichend erklärt und daher nur der Form halber hier gelistet, da diese Funktion zum Programmcode gehört.

089:
090:
091:
092:
093:
094:
095:
096:

097:
098:
099:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:

119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
function binary_multiples($size$praefix=true$shorttrue)
{

    if(
$praefix === true)
    {
        if(
$short === true)
        {
            
$norm = array('B''kB''MB''GB''TB'
            
              'PB''EB''ZB''YB');
        }
        else
        {
            
$norm = array('Byte'
                                        
'Kilobyte'
                                        
'Megabyte'
                                        
'Gigabyte'
                                        
'Terabyte'
                                        
'Petabyte'
                                        
'Exabyte'
                                        
'Zettabyte'
                                        
'Yottabyte'
                                        
);
        }
        
        
$factor 1000;
    }
    else
    {
        if(
$short === true)
        {
            
$norm = array('B''KiB''MiB''GiB''TiB'
                          'PiB''EiB''ZiB''YiB');
        }
        else
        {
            
$norm = array('Byte'
                                        
'Kibibyte'
                                        
'Mebibyte'
                                        
'Gibibyte'
                                        
'Tebibyte'
                                        
'Pebibyte'
                                        
'Exbibyte'
                                        
'Zebibyte'
                                        
'Yobibyte'
                                        
);
        }
        
        
$factor 1024;
        
    }
    
    
$count count($norm) -1;
    
    
$x 0;
    while (
$size >= $factor && $x $count
    { 
        
$size /= $factor
        
$x++;
    } 
  
  
$size sprintf("%01.2f"$size) . ' ' $norm[$x];

    return 
$size

}
Beispiel 6.11: copy_folder.php

Der restliche Programmcode ist weniger spektakulär. Wir benötigen den kompletten Pfad des zu kopierenden Verzeichnisses (153) sowie den kompletten Pfad für das Zielverzeichnis (155). Unser Statistik-Array (157, 158) für die kopierte Dateimenge sowie die komplette Dateigröße aller Dateien definieren wir im Grundzustand jeweils mit 0 (Null).

Wir rufen nur noch die Kopierfunktion (160) auf und geben im Anschluss daran die Dateigröße in Byte an unsere Funktion binary_multiples(). Sie können hier selbst entscheiden, wie Sie die Ausgabe wünschen.

153:
154:
155:
156:
157:
158:
159:
160:
161:
162:

163:
164:
$source '/is/htdocs/wp1042434_BDEO6BJ7VB/www/bilder/'

$dest '/is/htdocs/wp1042434_BDEO6BJ7VB/www/backup3/';

$statsCopyFolder['bytes'] = 0;
$statsCopyFolder['files'] = 0;

copyFolder($source$dest$statsCopyFoldertrue);

$statsCopyFolder['bytes'] = binary_multiples($statsCopyFolder['bytes'], 
   
truefalse);

echo 
$statsCopyFolder['files'] . ' Dateien kopiert ('.$statsCopyFolder['bytes'].').';
Beispiel 6.12: copy_folder.php

Wie Sie sehen, haben Sie jetzt eine Funktion, um ganze Verzeichnisse inkl. Unterverzeichnissen zu kopieren. Was allerdings noch fehlt, ist die Möglichkeit, alle Verzeichnisse wieder löschen zu können. Wir möchten Ihnen dieses nicht vorenthalten und werden im Kapitel "Verzeichnis rekursiv löschen" ein derartiges Programm zeigen.



 


Dieses Skript aus dem SELFPHP KOCHBUCH wurde von SELFPHP unter dem "Tarif Mc500" von McAc.net-Webhosting erfolgreich ausgeführt und getestet!

Auf der Übersichtseite unter "McAc.net – Webhosting zu diesem Buch" finden Sie weitere Informationen zu dem Webhostingpaket, dass durch SELFPHP getestet wurde.




 

Download

Info   ZIP BZIP2 TARGZ
Größe   1.49 Kilobyte 1.65 Kilobyte 1.56 Kilobyte

Alle Beispiele als PHP-Datei(en)

Hier haben Sie die Möglichkeit, sich sämtliche auf dieser Seite gezeigten Beispiele als PHP-Dateien direkt downzuloaden.

Umständliches Copy & Paste ist daher nicht mehr notwendig, da alle Beispiele sofort ausprobiert werden können.

Sie haben bei der Auswahl der bereitgestellten Downloads mehrere Möglichkeiten, je nachdem welches Komprimierungsverfahren Sie bevorzugen.

Zurück zur Übersichtsseite


 




:: Premium-Partner ::

Webhosting/Serverlösungen

PSW GROUP GmbH & Co. KG weitere Premium-Partner
 

:: SELFPHP Sponsor ::

ionCube Ltd. weitere Sponsoren
 


:: Buchempfehlung ::

TYPO3 Kochbuch

TYPO3 Kochbuch zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Webhosting/Serverlösungen

Suchen Sie den für Sie passenden IT-Dienstleister für Ihr Webhosting-Paket oder Ihre Serverlösung?

Sie sind nur ein paar Klicks davon entfernt!


 

Ausgewählter Tipp im Bereich PHP-Skripte


Dateien und Verzeichnisse mit TAR/Gzip komprimieren

Weitere interessante Beispiele aus dem SELFPHP Kochbuch finden Sie im Bereich PHP-Skripte
 

SELFPHP Code Snippet


Quersumme einer Ganzzahl (Integer) errechnen

Weitere interessante Code Snippets finden Sie auf SELFPHP im Bereich PHP Code Snippets
 
© 2001-2024 E-Mail SELFPHP Inh. Damir Enseleit, info@selfphp.deImpressumKontakt
© 2005-2024 E-Mail PHP5 Praxisbuch - Matthias Kannengiesser, m.kannengiesser@selfphp.de