Thread rmdir permission denied unter Windows XP (43 answers)
Opened by Thomas at 2009-10-16 14:20

Linuxer
 2009-10-22 10:52
#127237 #127237
User since
2006-01-27
3882 Artikel
HausmeisterIn

user image
Hi,

ich habe mal versucht, mir ein Programm zu stricken, dass in einem Verzeichnis die enthaltenen Unterverzeichnisse kontrolliert und die leeren Verzeichnisse löscht.

Bei mir werden alle gefundenen Verzeichnisse wunschgemäß gelöscht.
Habe es unter Linux, WinDOS 7 und WinDOS XP ausprobiert und kann Dein Problem so nicht nachvollziehen. (Update, siehe zwei Absätze tiefer.)

Erstelle doch bitte mal ein Minimalskript, mit dem Du Dein Problem reproduzieren kannst und poste das bitte.
Ohne von Dir lauffähigen Code zu erhalten, sehe ich schwarz, Dir weiter zu helfen.

Hm, da winkt mir grad eine kleine Idee aus den Überresten meiner Kristallkugel entgegen:
- Was verwendest Du als DIRHANDLE, wenn Du das Verzeichnis durchsuchst?
Benutze bitte lexikalische Handles, wenn Du es noch nicht tust.
Siehe auch dazu die Kommentare im Skript unten.

Wiki:Was ist ein lexikalischer Filehandle?
(@Mods: Krieg grad den Link ins Wiki nicht zustande; wer mag, kann meinen Link gerne ersetzen)

Folgendes Skript habe ich zum Testen benutzt:

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
#! /usr/bin/perl
use strict;
use warnings;
use File::Find;

my @empty;

sub _is_empty_dir {
        my ( $dir ) = @_;

        # return FALSE if not a directory
        return 0 if !-d $dir;

        # This does not work; last directory is not removed
        opendir DH, $dir or die "$dir: $!\n";
        my $cnt = grep { !m/\A\.\.?\z/ } readdir DH;


        # THIS WORKS!
        #opendir my $dh, $dir or die "$dir: $!\n";
        #my $cnt = grep { !m/\A\.\.?\z/ } readdir $dh;
        #closedir $dh;

        # if $cnt = 0 (empty $dir), returns TRUE
        # if $cnt > 0 (not empty $dir), returns FALSE
        return !$cnt;
}

sub wanted {
        push @empty, $File::Find::name if _is_empty_dir( $File::Find::name );
}

find( { wanted => \&wanted, }, 'C:/Temp' );

for my $dir ( @empty ) {
        print "deleting $dir\n";
        rmdir $dir or warn "$dir: $!\n";
}


edit: Wiki Link nachgetragen.

mod-edit pq: wiki-link portabel gemacht
Last edited: 2009-10-22 11:05:06 +0200 (CEST)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread rmdir permission denied unter Windows XP