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, $short= true)
{
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, $statsCopyFolder, true);
$statsCopyFolder['bytes'] = binary_multiples($statsCopyFolder['bytes'],
true, false);
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.
|