Ergebnis 1 bis 8 von 8

Thema: Problem mit rekrusiven verzeichnis-durchlauf

  1. #1
    Prinz(essin) Avatar von Greg10
    Registriert seit
    12.05.2007
    Beiträge
    825
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard Problem mit rekrusiven verzeichnis-durchlauf

    Also ich habe zunächst mal folgenden Code:
    Code:
    #!/usr/bin/perl
    
    use Digest::MD5 qw(md5 md5_hex md5_base64);
    
    $directory = '/home/gregor/.work/.web';
    $projects[0] = 'k-progs_product_page';
    
    foreach (@projects) {
    	$project = $_;
    	copy_rec($directory.'/k-core', $directory.'/'.$project);
    }
    
    sub copy_rec {
    	my($src, $dest) = @_;
    	opendir($dir, $src) or die "Could not open ".$src."\n";
    	@contents = readdir($dir) or die "Could not read ".$src."\n";
    	closedir($dir) or die "Could not close ".$src."\n";
    	$i = 0;
    	while($contents[$i] ne '') {
    		$i++;
    		$n = $i - 1;
    		$n = $contents[$n];
    		if ($n ne '..' && $n ne '.' && $n ne '.bzr') {
    			print "| '".$n."'\n";
    			if (-f $src.'/'.$n) {
    				copy_file($src.'/'.$n, $dest.'/'.$n);
    			} else { if (-d $src.'/'.$n) {
    				if (!-d $dest.'/'.$n) {
    					mkdir($dest.'/'.$n, 755);
    				}
    				print "> copy rec\n";
    				copy_rec($src.'/'.$n, $dest.'/'.$n);
    			} }
    		}
    	}
    	print "-\n";
    }
    
    sub copy_file {
    	my($src, $dest) = @_;
    	my $src_text;
    	my $dest_text;
    	if (-s $src != 0) {
    		open(SRC, $src) or die "Could not open ".$src."\n";
    		while($part = <SRC>) {
    			$src_text = $src_text.$part;
    		}
    		close(SRC) or die "Could not close ".$src."\n";
    	} else {
    		$src_text = '';
    	}
    	if (-s $dest != 0) {
    		open(DEST, $dest) or die "Could not open ".$src."\n";
    		while($part = <DEST>) {
    			$dest_text = $dest_text.$part;
    		}
    		close(DEST) or die "Could not close ".$src."\n";
    	} else {
    		$dest_text = '';
    	}
    	$src_sum = md5_hex($src_text);
    	$dest_sum = md5_hex($dest_text);
    }
    Die Ausgabe sieht wie folgt aus:
    Zitat Zitat von Bash
    | 'private'
    > copy rec
    | '.htaccess'
    | 'page_code'
    > copy rec
    | '1.php'
    -
    -
    -
    Allerdings ist im Verzeichnis /home/gregor/.work/.web/k-core WESENTLICH mehr als nur der Ordner private/ auch in den unter Ordnern übrigens
    es sieht also so aus als würde er die Schleife abbrechen nachdem er copy_rec() aufruft...
    Woran könnte das liegen?
    Und, was viel wichtiger ist, wie kann ich das Problem beheben?

    Schonmal danke

    MFG Greg10
    Achtung: Dies ist ein alter Thread im HTML und Webmaster Forum
    Diese Diskussion ist älter als 90 Tage. Die darin enthaltenen Informationen sind möglicherweise nicht mehr aktuell. Erstelle bitte zu deiner Frage ein neues Thema im Forum !!!!!
    Orthografie und Grammatik in diesem Beitrag sind frei erfunden und eine eventuell gefundene Übereinstimmung mit einer lebenden oder toten Sprache sollte von allen Beteiligten unverzüglich ignoriert werden.

    K-Progs (In bearbeitung)
    Der inoffizielle Forum-hilfe IRC-Channel
    (Server: irc.freenode.net ; Channel: #forum-hilfe) (Client für FF)
    Ich hab auch 'n Jabber-Account beim CCC

  2. #2
    der/die Göttliche Avatar von jojo87
    Registriert seit
    23.03.2007
    Ort
    Leipzig
    Alter
    30
    Beiträge
    3.131
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard AW: Problem mit rekrusiven verzeichnis-durchlauf

    ok, is jetzt vielleicht ein bissel am Thema vorbei, aber was solls.
    Warum machst du keine echte Rekursion? Das bietet sich für Ordnerdurchläufe doch an?

  3. #3
    Prinz(essin)
    Themenstarter
    Avatar von Greg10
    Registriert seit
    12.05.2007
    Beiträge
    825
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard AW: Problem mit rekrusiven verzeichnis-durchlauf

    Ist das denn keine echte Rekursion?
    Wie soll die denn aussehen?
    Orthografie und Grammatik in diesem Beitrag sind frei erfunden und eine eventuell gefundene Übereinstimmung mit einer lebenden oder toten Sprache sollte von allen Beteiligten unverzüglich ignoriert werden.

    K-Progs (In bearbeitung)
    Der inoffizielle Forum-hilfe IRC-Channel
    (Server: irc.freenode.net ; Channel: #forum-hilfe) (Client für FF)
    Ich hab auch 'n Jabber-Account beim CCC

  4. #4
    Forum Guru Avatar von The User
    Registriert seit
    28.10.2007
    Ort
    Zwischen Pazifik und Atlantik...
    Beiträge
    4.044
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard AW: Problem mit rekrusiven verzeichnis-durchlauf

    Echte Rekursion heißt, dass die Funktion sich selbst aufruft. Du rufst die dann einfach für Unterverzeichnis erneut auf.
    Das macht dann automatisch für dich die ganze Zwischenspeicherung und es ist sehr viel kürzer.

  5. #5
    Prinz(essin)
    Themenstarter
    Avatar von Greg10
    Registriert seit
    12.05.2007
    Beiträge
    825
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard AW: Problem mit rekrusiven verzeichnis-durchlauf

    das tu ich doch?
    die funktion liest den content des ordners der übergeben wurde aus und überprüft dann für jede datei ob sie denn auch wirklich eine datei oder ein verzeichniss ist, falls sie denn eines ist ruft die funktion SICH SELBST auf und übergibt das unterverzeichnis
    Orthografie und Grammatik in diesem Beitrag sind frei erfunden und eine eventuell gefundene Übereinstimmung mit einer lebenden oder toten Sprache sollte von allen Beteiligten unverzüglich ignoriert werden.

    K-Progs (In bearbeitung)
    Der inoffizielle Forum-hilfe IRC-Channel
    (Server: irc.freenode.net ; Channel: #forum-hilfe) (Client für FF)
    Ich hab auch 'n Jabber-Account beim CCC

  6. #6
    der/die Göttliche Avatar von jojo87
    Registriert seit
    23.03.2007
    Ort
    Leipzig
    Alter
    30
    Beiträge
    3.131
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard AW: Problem mit rekrusiven verzeichnis-durchlauf

    Also ich seh hier nur nen Wust (ist jetzt nicht böse gemeint) aus Schleifen.
    Rekursion heisst nicht, dass man auch Unterordner einbezieht, sondern dass eine Funktion sich immer wieder selbst aufruft, und ein Problem damit in kleinstmögliche Teilprobleme zerlegt.
    Ein Beispiel(Javascript):
    Code:
    /*Rekursion zur Berechnung der Fakultaet*/
    function fakultaet(x) {
    if(x == 0)
    {
      return 1;
    }
    else
    {
      return x*fakultaet(x-1);
    }
    }
    Die Fakultät einer natürlichen Zahl ist die Zahl multipliziert mit jedem seiner natürlichen Vorgänger. Somit ist Fakultät 4 (auch: 4!) gleich 4 * 3!. 3! ist wiederum gleich 3 * 2! etc.
    Das Problem wird somit immer kleiner.

    Ich hab keine Ahnung von Perl, und somit auch kein Plan, was du eigentlich machen willst.
    Aber z.Bsp. ein rekursiver rm unter Linux löscht ja auch nicht ganze Ordner, sondern zerlegt das Problem in das Löschen vieler einzelner Dateien.

    Klar soweit?
    Vorteil ist, dass dein Code damit mit Sicherheit um einiges schlanker wird.
    Aber Vorsicht: Rekursionen mit Bedacht einsetzen, da sie meist teurer sind.

    Gruß,
    Jojo

  7. #7
    Prinz(essin)
    Themenstarter
    Avatar von Greg10
    Registriert seit
    12.05.2007
    Beiträge
    825
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard AW: Problem mit rekrusiven verzeichnis-durchlauf

    Der Wust ist das Resultat meiner Versuche das Problem zu lösen...
    Nur so bin ich auf das eigentliche Problem gekommen
    Was ich machen will ist ein Verzeichniss rekursiv zu kopieren, und dazu zerlege ich das Problem des kopierens des gesamten Ordnerinhalts immer wieder in das kleinere Problem nur den Inhalt des einen Unterordners zu kopieren, also auf deine Definition trifft meine herangehendsweise durchaus zu.

    Aber darum geht es hier ja eigentlich garnicht, mein eigentliches Problem ist ja, dass die ausführung der Schleife in der "Elternfunktion" beim aufruf der "Kindfunktion" abgebrochen wird.

    (übrigens sind in dem code genau vier schleifen, zwei sind allerdings nur für das auslesen von datei-inhalt und die erste ist auch nur dafür da, dass das GANZE script für jedes einzelne Projekt ausgeführt wird )
    Geändert von Greg10 (24.01.2009 um 00:19 Uhr)
    Orthografie und Grammatik in diesem Beitrag sind frei erfunden und eine eventuell gefundene Übereinstimmung mit einer lebenden oder toten Sprache sollte von allen Beteiligten unverzüglich ignoriert werden.

    K-Progs (In bearbeitung)
    Der inoffizielle Forum-hilfe IRC-Channel
    (Server: irc.freenode.net ; Channel: #forum-hilfe) (Client für FF)
    Ich hab auch 'n Jabber-Account beim CCC

  8. #8
    Prinz(essin)
    Themenstarter
    Avatar von Greg10
    Registriert seit
    12.05.2007
    Beiträge
    825
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard AW: Problem mit rekrusiven verzeichnis-durchlauf

    Es scheint als hätte ich mein Problem jetzt gelöst
    Ich müsste nur einige variablen mit my definieren
    Siehe hier:
    Code:
    #!/usr/bin/perl
    
    use Digest::MD5 qw(md5 md5_hex md5_base64);
    
    $directory = '/home/gregor/.work/.web';
    $projects[0] = 'k-progs_product_page';
    
    foreach (@projects) {
    	$project = $_;
    	copy_rec($directory.'/k-core', $directory.'/'.$project);
    }
    
    sub copy_rec {
    	my($src, $dest) = @_;
    	my $dir;
    	my @dir = ();
    	opendir($dir, $src) or die "Could not open ".$src."\n";
    	@dir = readdir($dir) or die "Could not read ".$src."\n";
    	closedir($dir) or die "Could not close ".$src."\n";
    	my $i = 0;
    	while($dir[$i] ne '') {
    		$i++;
    		$n = $i - 1;
    		$n = $dir[$n];
    		if ($n ne '..' && $n ne '.' && $n ne '.bzr') {
    			if (-f $src.'/'.$n) {
    				copy_file($src.'/'.$n, $dest.'/'.$n);
    			} else { if (-d $src.'/'.$n) {
    				if (!-d $dest.'/'.$n) {
    					mkdir($dest.'/'.$n, 755);
    				}
    				copy_rec($src.'/'.$n, $dest.'/'.$n);
    			} }
    		}
    	}
    }
    
    sub copy_file {
    	my($src, $dest) = @_;
    	my $src_text;
    	my $dest_text;
    	if (-s $src != 0) {
    		open(SRC, $src) or die "Could not open ".$src."\n";
    		while($part = <SRC>) {
    			$src_text = $src_text.$part;
    		}
    		close(SRC) or die "Could not close ".$src."\n";
    	} else {
    		$src_text = '';
    	}
    	if (-s $dest != 0) {
    		open(DEST, $dest) or die "Could not open ".$src."\n";
    		while($part = <DEST>) {
    			$dest_text = $dest_text.$part;
    		}
    		close(DEST) or die "Could not close ".$src."\n";
    	} else {
    		$dest_text = '';
    	}
    	$src_sum = md5_hex($src_text);
    	$dest_sum = md5_hex($dest_text);
    	if ($src_sum ne $dest_sum) {
    		print $src."\n";
    	}
    }
    Orthografie und Grammatik in diesem Beitrag sind frei erfunden und eine eventuell gefundene Übereinstimmung mit einer lebenden oder toten Sprache sollte von allen Beteiligten unverzüglich ignoriert werden.

    K-Progs (In bearbeitung)
    Der inoffizielle Forum-hilfe IRC-Channel
    (Server: irc.freenode.net ; Channel: #forum-hilfe) (Client für FF)
    Ich hab auch 'n Jabber-Account beim CCC

Ähnliche Themen

  1. Verzeichnis löschen
    Von xtreme-white-shark im Forum Forum für alle anderen Programmiersprachen
    Antworten: 1
    Letzter Beitrag: 14.10.2007, 01:57
  2. Verzeichnis einlesen, ...
    Von OJMD im Forum PHP Forum - Apache - CGI - Perl - JavaScript und Co.
    Antworten: 12
    Letzter Beitrag: 02.11.2006, 17:14
  3. Artikel-Verzeichnis.Net
    Von hphelp im Forum Eure Homepages und Foren - Vorstellung und Bewertungen
    Antworten: 1
    Letzter Beitrag: 31.10.2006, 09:19
  4. verzeichnis auslesen
    Von pindakaas im Forum PHP Forum - Apache - CGI - Perl - JavaScript und Co.
    Antworten: 4
    Letzter Beitrag: 10.03.2006, 01:29
  5. CGI-Verzeichnis
    Von im Forum PHP Forum - Apache - CGI - Perl - JavaScript und Co.
    Antworten: 2
    Letzter Beitrag: 17.08.2005, 11:59

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •