Thread Datei oder Verzeichnis nicht gefunden (18 answers)
Opened by hcx at 2011-07-02 18:04

topeg
 2011-07-02 19:24
#150081 #150081
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
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.
CPAN:File::Spec erlaubt es Plattformunabhängig mit Pfaden zu arbeiten.

Hier ein Beispiel wie man es machen kann:
more (23.8kb):
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)

View full thread Datei oder Verzeichnis nicht gefunden