Thread Datei oder Verzeichnis nicht gefunden
(18 answers)
Opened by hcx at 2011-07-02 18:04
zu opendir gehört closedir.
Die an die Funktion übergebenen Parameter müssen eingelesen sein bevor du sie benutzt. Ein Verzeichnis kann nicht gelöscht werden, wenn es nicht leer ist. Im zu löschenden Ordner können auch Unterordner und Spezialdateien enthalten sein. Ein Test ob der zu löschende Ordner existiert ist sicher sinnvoll. Es fehlt eine schließende klammer am Ende. ![]() Hier ein Beispiel wie man es machen kann: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 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 #!/usr/bin/perl # Skript loescht saemtliche Dateien im Ordner, # den wir hier eingeben und wenn der Ordner leer ist # loescht es den leeren Ordner. # Symlinks und Unterordner werden nicht gelöscht use strict; use warnings; # macht das bearbeitzen von Pfaden unabhänig vom benutzen Betriebsystem use File::Spec; my $sammel_pfad = "/home/uli/logs"; my $log_datei ='loesch_logfile.txt'; my $log_pfad = File::Spec->join($sammel_pfad, $log_datei); my $ordner=''; # Abfrage des Ordners und # Sicherheitsabfragen while(!$ordner) { print "In welchen Ordner soll ich alle Dateien loeschen?\n"; $ordner = <STDIN>; chomp $ordner; if(-d $ordner) { print "Danke soll ich dann wirklich alle Dateien in $ordner loeschen? [j/N]\n"; my $entscheidung = <STDIN>; chomp($entscheidung); # wenn keine Eingabe dann ist 'n' gemeint! $entscheidung='n' unless($entscheidung); if(lc($entscheidung) eq 'j') { print "#\n#ALLE Dateien in $ordner werden gelöscht\n#\n"; } else { print "#\n#Breche das Programm ab \n#\n"; #exit mit errorcode 1 exit(1); } } else { print "Ordner $ordner existiert nicht oder ist eine Datei\n"; print "Erneute Eingabe? [J/n]\n"; my $entscheidung = <STDIN>; chomp($entscheidung); # wenn keine Eingabe, dann ist 'j' gemeint! $entscheidung='j' unless($entscheidung); unless(lc($entscheidung) eq 'j') { print "#\n#Breche das Programm ab \n#\n"; #exit mit errorcode 2 exit(2); } } } open(my $logfh, '>', $log_pfad) or die "Kann LOG_Datei $log_datei nicht oeffnen: $!\n"; print "#\n#\n# Schreibe ab jetzt in Log Datei $log_datei !\n#\n#\n"; loesche($logfh, $ordner); close $logfh; ######################################################################### ######################################################################### # Funktion loescht nacheinander mittels foreach Schleife datei fuer datei im Ordner # übergebene Parameter # - loging filehandle # - Pfad zum Ordner sub loesche { # Funktion loesche wird mit Argument $ordner my $log=shift; my $dir=shift; print $log "START\n"; print $log "#\n#\n#\n"; print $log "Bearbeite $dir\n"; opendir(my $dfh, $dir) or die "error open $dir $!"; my @remove = readdir($dfh); closedir($dfh); for my $datei (@remove) { # virtuelle Ordner . und .. überspringen next if ($datei eq '.' or $datei eq '..'); my $pfad=File::Spec->join($dir,$datei); if (-l $pfad) { print "Habe einen Link $datei gefunden loesche diesen nicht\n"; next; # überspinge rest der schleife überspringen } # Die datei ist wirklich eine Datei if(-f $pfad) { # unlink löscht dateien im Ordner if(unlink($pfad)) { print $log "NACHRICHT\n"; print $log "#\n#\n#\n"; print $log "Habe die Datei $datei geloescht!\n"; } else { print $log "FEHLER\n"; print $log "#\n#\n#\n"; print $log "Konnte die Datei $datei nicht löschen! ($!)\n"; } next; } # alles andere nicht löschen! print "$datei ist Ordner oder Spezialdatei, wird ignoriert!\n"; } print $log "ENDE\n"; print $log "#\n#\n#\n"; # testen ob das Verzeichnis leer ist if(glob( File::Spec->join($dir,'*') )) { print $log "Habe die Ordner $dir nicht geloescht! Es ist nicht leer!\n"; } else { # rmdir löscht leere Verzeichnisse also den leeren Ordner rmdir($ordner) or die "ERROR remove $ordner $!"; print $log "Habe die Ordner $dir geloescht!\n"; } } Edit: fehlendes $log_pfad ergänzt. Danke für den Hinweis. Last edited: 2011-07-03 11:18:28 +0200 (CEST) |