Perl-Projekt

bigb702

Lt. Junior Grade
Registriert
Juli 2005
Beiträge
283
Hallo!

Ich habe als Project in Anwendungentwicklung in Perl ein Programm zu schreiben, welches ein Dateisystem bzw. durchsucght, und die Informatien mit denen in einer Datenbank vergleicht (MySQL oder PostgreSQL), um rauszufinden, welche Datein/Ordner verändert wurden, gelöscht, hinzugefügt wurden (am bestzen nch mit Datum und Zeit) und die Änderungen dann als Website ausgibt. Momentan versuche ich alle Ordner und Datei auszulesen, kriege es aber nicht hin, zwischen Datei und Ordner zu unterscheiden.

Da ich noch nicht so lange m1it Perl arbeite, bitte ich euch mir mal n paar Tips zu geben, wie ich vorgehe, was ich beachten soll....eigentlich alles, was mir helfen kann.

Danke im Vorraus und MfG
 
AW: Perl-Projekt, bitte um Hilfe

Ich habe noch nie mit Perl gearbeitet, aber jede Programmiersprache die ich schon durchgenommen habe (Python, PHP, Delphi etc...), hatte bisher Funktionen/Methoden um von Ordnern und Dateien zu unterscheiden. Wie wäre es, wenn du mal die Dokumentation durchsuchst? ;)
 
AW: Perl-Projekt, bitte um Hilfe

Momentan versuche ich alle Ordner und Datei auszulesen, kriege es aber nicht hin, zwischen Datei und Ordner zu unterscheiden.

Ich habe noch nie mit Perl gearbeitet, aber jede Programmiersprache die ich schon durchgenommen habe (Python, PHP, Delphi etc...), hatte bisher Funktionen/Methoden um von Ordnern und Dateien zu unterscheiden.

Und falls es das nicht gibt, kannst du ja die ausgelesenen Namen mit einen Regex überprüfen. Wenn in dem Namen ein Punkt drinvorkommt ists ne Datei und wenn nicht n Ordner. Denn Dateien haben ja normalerweise ne Endung vor der ein Punkt steht ;)

Einzige Einschränkung wär dann halt nur, dass in ordnernamen keine punkte vorkommen dürfen...
 
AW: Perl-Projekt, bitte um Hilfe

Das ist unter Windows vielleicht so, aber Linux/Unix/MacOS etc. sind die Dateien ohne Dateiendung üblich.
 
AW: Perl-Projekt, bitte um Hilfe

Schau mal hier, dort findest Du die Perl-Standard module für die Dateiverwaltung :)
 
AW: Perl-Projekt, bitte um Hilfe

Danke! Habe es mit File::Find gemcht. Sieht jetzt so aus:

GELÖSCHT



Update:

So so gehts. Es durchsucht die als Parameter angebenen Ornder und gibt sie mit Größe und Datum der letzten Änderung aus.
Nur will ich es noch erweitern. Ich will Parameter wie -d angeben, damit er dann nur das Datum ausgibt oder -a für alles. Ich krieg es nur nich hin, daß
er -d nich als Ordner nimmt. Daher meckert er dabei dann "no such file or directory". Dabei soll er dann aber bei dem 2. $ARGV weiter machen.

#Einbinden nötiger Module
use strict;
use warnings;
use Cwd 'abs_path';
use IO::Handle;
STDOUT-> autoflush(1);
my $groesse;
my $pfadtotal;
my @baum;
my $ar;
my $i;
my $d;
my $g;
my $a;

for my $arg (@ARGV) {

if ($ARGV[0] eq 'help'){
help();
}elsif ($ARGV[0] eq '-d'){
$d = 1;
my $pfadtotalnormal = $arg;
$pfadtotal = abs_path($pfadtotalnormal);
print "\n";
folder_size($pfadtotal);

} elsif ($ARGV[0] eq '-a'){
$a = 3;

my $pfadtotalnormal = $arg;
$pfadtotal = abs_path($pfadtotalnormal);
print "\n";
folder_size($pfadtotal);

sub folder_size {

# Variablen initialisieren
my $pfad = shift;
local *DIR;
my @dateien = ();
my $groesse += -s $pfadtotal;

# Verzeichnis lesen
opendir(DIR, $pfad);
@dateien = readdir(DIR);
closedir(DIR);

# Addition oder Rekursion fuer alle gelesenen
foreach my $datei (@dateien) {
next if ($datei eq '.' || $datei eq '..' || $datei eq 'laa');
my $pfadtotal = "$pfad/$datei";
if (-l $pfadtotal) {
# macht er nichts
} elsif(-d $pfadtotal ){
$groesse += folder_size($pfadtotal);
} elsif (-f $pfadtotal) {
@baum = split(/\//, $pfadtotal);
my $anzahl = scalar @baum;
$anzahl = $anzahl-1;
my $write_secs = (stat(_))[9];
my $ft = scalar(localtime($write_secs)) ;
my @fZeit1 = split(/ +/,$ft);
my $fDatum1 = "$fZeit1[2].$fZeit1[1].$fZeit1[4]";
my $size = -s $pfadtotal;
$groesse += -s $pfadtotal;
print "\n";
printf '%20s',$baum[$anzahl];
# if ($g eq '1' || $a eq '3' ){
# printf "%10s Byte %10.5f MByte", $size , $size/1024/1024;
#} elsif ($d eq '2' || $a eq '3' ){
printf '%35s', "|| Zuletzt geändert: $fDatum1", "\n\ņ";
#}
}

# Umrechnen in MByte
my $write_secs = (stat($pfad))[9];
my $ft = scalar(localtime($write_secs)) ;
my @fZeit1 = split(/ +/,$ft);
my $fDatum1 = "$fZeit1[2].$fZeit1[1].$fZeit1[4]";
print "\n-------------------------------------------------------------------------------------------------------------------------\n\n";
#if ($g eq '1' || $a eq '3' ){
printf " Gesamtgröße des Ordners $pfad:";
printf "%10s Byte %10.5f MByte", $groesse , $groesse/1024/1024;
#} elsif ($d eq '1' || $a eq '3' ) {
printf '%35s', "|| Zuletzt geändert: $fDatum1 \n\n";

return ($groesse);
}
}
}
}

PS: Voll kompatibel ist das Prog unter Linux.
 
Zuletzt bearbeitet:
AW: Perl-Projekt, bitte um Hilfe

und funktionierts ? bei unix / linux gibt es zb keinen unterscheied zwischen ordnern und dateien
 
AW: Perl-Projekt, bitte um Hilfe

@riod

Klar gibt es einen Unterschied - wird dir sogar angezeigt - lass dir mal die ls -l in einem Ordner mit versch. Inhalten ausgeben ... da siehst du schon die 10-stelligen Zugriffsrechte ... das erste Zeichen ist ein "-" für Dateien, ein "d" für Verzeichnisse und ein "l" für Links. In den meisten Sprachen gibt es dann auch entsprechende Methoden / Funktionen wir z.B. isFile() oder isDirector() zur Abfrage.
 
AW: Perl-Projekt, bitte um Hilfe

So. Wenn mal drauf kommt, ist es nicht schwer. Jedenfalls gehts jetzt.

Das letzte, was ich noch meiner rekursiven Schleife beibringen will, ist, daß wenn ich -s {Suchwort}, daß der dann in dem Ordner so lange druch läuft, bis er dann das Suchwort gefunden hat und den Pfad ausgibt wo er ist. Bis her kriege isch das nur hin, wenn es ein ordner ist, und er ein direkter Unterordner des angegebenen Verzeichnisses ist:

foreach my $datei (@dateien) {
next if ($datei eq '.' || $datei eq '..' || $datei eq 'proc' || $datei eq 'sys' || $datei eq 'boot' || $datei eq 'dev');
if ($ARGV[0] eq '-s' ){
next if ($datei ne $ARGV[1]);
print $pfadtotal;

Bei Datein geht der die immer weiter rekursiv die Objekte durch. Soll aber stoppen, wenn ers gefunden hat.
 
Zurück
Oben