perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 29
Click for quality!




10.02.2012 / 20:40

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragRekursion beim Ordner auslesen scheitert!
Seitenanfang
Ich habe ein Script geschrieben, dass rekusriv alle Ordner durchforsten soll und Informationen über die enthaltenen Dateien in eine Text-Datei schreibt.

Es funktioniert aber leider nur auf der ersten Ebene! Sobald ich den ersten Ordner rekursiv aufrufe, wird nicht mehr korrekt unterschieden ob es sich um die Dort enthaltenen Daten um Dateien oder Ordner handelt! An dieser Stelle scheitert das Script!

Weiß jemand wo der Fehler liegen könnte?

Hier der Code:


sub auslesen() {
my $Verzeichnis = shift; #shift hängt Parameter ab
opendir(DIR, $Verzeichnis) || die "$Verzeichnis: $!"; #öffnet Dateistrom zu dem Verzeichnis unter dem Bezeichner DIR, bei Misserfolg "stribt" das Programm
my @Dateien = readdir(DIR);
closedir(DIR);

foreach(@Dateien) {
$Pfad = $Verzeichnis."/".$_; #Erstellt Pfad zur Datei

if(-d "$_") { #Abfrage ob Verzeichnis/Ordner
if($_ ne "." && $_ ne "..") { #ne = not equal | Es handelt sich nicht um das Verzeichnis selbst (".") und nicht um das darüberliegende Verzeichnis (..)
print "Rekursion: $Pfad\n";
&auslesen($Pfad); #Rekursiver Aufruf der Prozedur auslesen()
}
}
else { #Es handelt sich um eine Datei
open(DATEI, "+>>dateien.txt") || die "$!";

my @Info = stat($_); #stat() liefert Informationen zu einer Datei
$size = -s $_; #Ermittelt Dateigröße
print "Pruefsumme von $Pfad\t:";
print -d $_;
print ":";
print "\n";
$md = &pruefsumme($Pfad); #Ermittelt MD5-Wert

#Lenke den Ausgabestrom auf DATEI; nicht mehr auf Konsole
print DATEI "$Pfad\t$md\t$Info[8]\t$Info[9]\t$size\n"; #Info[8] = Letzte Änderung; Info[9] = Letzter Zugriff
close(DATEI);
}
}
}

Datum: 02.03.2006-14:26

Beitragre: Rekursion beim Ordner auslesen scheitert!
Seitenanfang
Rekursion kannst du ganz prima mit dem Standardmodul File::Find erledigen ( http://perldoc.perl.org/File/Find.html ).

Ich war mal so frei dein Programm umzuschreiben ;-)

#!/usr/bin/perl

use strict;
use warnings;

use File::Find;
use Digest::MD5 qw{md5_hex};

my $verzeichnis = 'PFAD_ZUM_VERZEICHNIS';

sub pruefsumme {
return md5_hex($_[0]);
}

sub dateien_pruefen {

if(-d $File::Find::name) {
print "Rekursion: $File::Find::name\n";
}

else {
print
"Pruefsumme von $File::Find::name\t",
#-d $File::Find::name,
"\n";
}

print DATEI
join "\t", (
$File::Find::name,
pruefsumme($File::Find::name),
( stat($File::Find::name) )[8,9],
-d $_
),
"\n"
;
}

open(DATEI, "+>>dateien.txt") || die "$!";
find(\&dateien_pruefen, $verzeichnis);
close(DATEI);

Datum: 02.03.2006-17:18

Beitragre: Rekursion beim Ordner auslesen scheitert!
Seitenanfang
Hi,

ich habe eine Version ohne File::Find anzubieten. Obwohl ich gestehen muss, dass ich das Modul alsbald einfügen werde. Es simplifiziert den Programmieraufwand ungemein.

http://warp-factor.homelinux.net/cgi-bin/tutorials/source.cgi?f=m5s.pl

-uw

Datum: 05.03.2006-21:27

Beitragre: Rekursion beim Ordner auslesen scheitert!
Seitenanfang
Danke für eure Antworten. Habe jedoch auch eine Lösung gefunden (ohne File::Find).

Mit einem chdir() an der richtigen Stelle funktioniert alles einwandfrei.

Hier mein Quelltext:


sub auslesen() {
my $Verzeichnis = shift; #shift hängt Parameter ab; holt erstes Parameter
chdir($Verzeichnis);
opendir(DIR, $Verzeichnis) || die "$Verzeichnis: $!"; #öffnet Dateistrom zu dem Verzeichnis unter dem Bezeichner DIR, bei Misserfolg "stribt" dasP rogramm
my @Dateien = readdir(DIR);
closedir(DIR);

foreach(@Dateien) {
my $Pfad = $Verzeichnis."/".$_; #Erstellt Pfad zur Datei

if(-d $Pfad) { #Abfrage ob Verzeichnis/Ordner
if($_ ne "." && $_ ne "..") { #ne = not equal | Es handelt sich nicht um das Verzeichnis selbst (".") und nicht um das darüberliegende Verzeichnis (..)
&auslesen($Pfad); #Rekursiver Aufruf der Prozedur auslesen()
}
}
else { #Es handelt sich um eine Datei
open(DATEI, "+>>$Speicherort") || die "$!";

my @Info = stat($_); #stat() liefert Informationen zu einer Datei
$size = -s $_; #Ermittelt Dateigröße

$md = &pruefsumme($Pfad); #Ermittelt MD5-Wert

#Lenke den Ausgabestrom auf DATEI; nicht mehr auf Konsole
print DATEI "$Pfad\t$md\t$Info[8]\t$Info[9]\t$size\n"; #Info[8] = Letzte Änderung; Info[9] = Letzter Zugriff
close(DATEI);
}
}
}

Datum: 06.03.2006-17:12

Beitragre: Rekursion beim Ordner auslesen scheitert!
Seitenanfang

Ist I/O-Technisch sehr ineffizient dein Script :

Du öffnest für jede überprüfte Datei das Logfile und machst es wieder zu.
Du solltest die Log-Datei nur einmal vor der ganzen Aktion öffnen und hinterher schließen.

Und die jeweils 5 oder 6 print Anweisungen die sich in einer zusammenfassen lassen und das zwischenspeichern von Werten in Variablen die schon eine Zeile später wieder gebraucht werden tun ihr übriges.

Wobei ich sagen muß, meine Version wäre ohne das joinen auch schneller, da wär ne kommagetrennte Liste 'ne ganze ecke besser ;-)

Datum: 06.03.2006-17:51

-






-
-