Jörg: Kopieren von Dateien nur dann, wenn sie unterschiedlich sind?

Hallo,

wie kann ich dieser rekursiven Kopierfunktion beibringen, nur dann eine Datei oder eine Verzeichnis zu kopieren bzw. zu überschreiben, wenn die Datei nicht bereits völlig identisch ist?

Ist eine Überprüfung über einen Hash-Wert möglich/sinnvoll oder über Dateiattribute besser?

Wer hat hier einen guten Ansatz für mich?

Hintergrund ist, dass ich viele Verzeichnisse/Ordner habe und diese per Schleife auf einige Verzeichnisse clonen möchte, aber ein bißchen Sorge habe, in den Script-timeout des Hosters zu geraten.

Grüße, Jörg

und hier die Funktion

  
function copyFolder($source, $dest, &$statsCopyFolder, $recursive = TRUE)  
{  
  
	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);  
	  
}  

  1. Ist eine Überprüfung über einen Hash-Wert möglich/sinnvoll oder über Dateiattribute besser?

    Es hat sich für mich - in einem anderen Zusammenhang - herausgestellt, dass es sinnvoll ist zunächst die Dateigrößen zu vergleichen, nur gleich große Dateien _können_ überhaupt gleich sein, sind sie es nicht spart man sich eine weitere Prüfung.
    Aufwendig kann man nun bitweise vergleichen oder einen Hash. Letzteres ist simpler, ersteres unter Umständen performanter (wobei: In php denke ich nicht).
    Aber wie gesagt, über Attribute (insbesondere Größe) kannst du prima eine Vorabprüfung machen ob sich eine ressourcen-lastigere Prüfung überhaupt lohnt.

    --
    sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
  2. Hi,

    wie kann ich dieser rekursiven Kopierfunktion beibringen, nur dann eine Datei oder eine Verzeichnis zu kopieren bzw. zu überschreiben, wenn die Datei nicht bereits völlig identisch ist?

    Versprichst Du Dir davon viel?

    Ist eine Überprüfung über einen Hash-Wert möglich/sinnvoll oder über Dateiattribute besser?

    Wie erhältst Du die beiden Hashwerte? Indem Du beide Dateien liest.
    Wenn die Hashwerte nicht übereinstimmen, muß die Quelldatei nochmal gelesen und die Zieldatei geschrieben werden.

    Nichts gewonnen, aber 2mal Dateilesen + 2mal Hashberechnen verloren.

    Wenn die Hashwerte übereinstimmen, hast Du zweimal Dateilesen und zweimal Hashberechnen verloren.

    Ob sich der Aufwand lohnt, ist fraglich.

    Bei unterschiedlichen Dateigrößen kann man natürlich das Lesen und Hashberechnen weglassen und direkt kopieren.
    Bei gleicher Dateigröße muß das aber doch geschehen, da ja eine Änderung des Inhalts nicht unbedingt eine Größenänderung bewirkt.

    Je nach Umgebung könnte man auch noch die Zeitstempel der Dateien berücksichtigen - aber das hängt natürlich davon ab, ob die Zeitstempel der Zieldateien nur durch die Kopieraktionen verändert werden oder nicht - wenn das der Fall ist: kopieren, wenn Quelldatei neuer als Zieldatei ist. Sonst: Hashberechnen ...

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  3. Moin Moin!

    Du willst rsync neu erfinden. Wozu?

    Hast Du rsync Algorithmus schon gelesen?

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".