Leser: 24
1 2 3 4 5 6
find(\&matched, $suchpfad); foreach (@delarray) { print "deleting $_\n"; rmdir("$_") || die "remove dir: $!"; }
1 2 3 4 5 6 7
find(\&matched, $suchpfad); chdir($suchpfad); foreach (@delarray) { print "deleting $_\n"; rmdir("$_") || die "remove dir: $!"; }
push(@delarray, "$File::Find::dir");
1 2 3 4 5 6 7 8
my @delarray; push @delarray,"D:/aa a/_bbb/_ccc/S455_00015653"; push @delarray,"D:/aa a/_bbb/_ccc/S455_00015654"; foreach (@delarray) { print "deleting $_\n"; rmdir("$_") || die "remove dir: $!"; }
QuoteD:\aa a\_bbb\_ccc>
QuoteD:\aa a\_bbb>rmdir _ccc
Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.
1 2 3 4 5 6 7
find(\&matched, $suchpfad); chdir($suchpfad) || die "chdir: $!"; foreach (@delarray) { print "deleting $_\n"; rmdir("$_") || die "remove dir: $!"; }
QuoteD:\Arbeit\Handle>handle > handles.txt
QuoteHandle v3.42
Copyright (C) 1997-2008 Mark Russinovich
Sysinternals - www.sysinternals.com
------------------------------------------------------------------------------
perl.exe pid: 1596 DOMAIN\user
C: File (RW-) D:\aa a\_bbb\_ccc\S455_00015655
790: File (RW-) D:\aa a\_bbb\_ccc
find(no_chdir,\&matched, $suchpfad);
find({ wanted => \&process, follow => 1 }, '.');
find( { wanted => \&matched, no_chdir => 1 }, $suchpfad );
1 2 3
use File::Find::Rule; # find all the subdirectories of a given directory my @subdirs = File::Find::Rule->directory->in( $directory );
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
local *VERZEICHNIS; my @lesen; push @lesen,'d:/arbeit'; while (scalar @lesen) { my $verz = shift @lesen; opendir (VERZEICHNIS,$verz) or die "$!"; foreach my $file (sort {$a cmp $b} readdir VERZEICHNIS) { if (-d "$verz/$file") { push @lesen,"$verz/$file" if $file ne '.' && $file ne '..'; } elsif ($file =~ /a/) { # Durch Regex Treffer ermitteln print "Datei mit a: >$file< im Verzeichnis >$verz<\n"; # Was machen } } closedir VERZEICHNIS; }
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
my @delarray; my @lesen; push @lesen,"$suchpfad"; while (scalar @lesen) { my $verz = shift @lesen; opendir (VERZEICHNIS,$verz) or die "$!"; foreach my $file (sort {$a cmp $b} readdir VERZEICHNIS) { if (-d "$verz/$file") { push @lesen,"$verz/$file" if $file ne '.' && $file ne '..'; } elsif ($file =~ /^$xmldatei$/) { #hier mache ich noch ein paar wilde Sachen, # u.a. wieder Verzeichnisse in @delarray pushen } } closedir VERZEICHNIS; } foreach(@delarray) { rmdir $_ || die "remove dir: $!"; }
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"; }
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
#!/usr/bin/perl -w use strict; use warnings; use File::Copy; # im unten eingeklammerten Bereich können die Variablen geändert werden ACHTUNG: Auch unter Windows / statt \ verwenden ########################################################################## # wo befinden sich XML und PDF-Dateien? my $suchpfad = "D:/aa a/_bbb/_ccc"; # wie heißt die XML-Datei? my $xmldatei = "ready.xml"; #Wie heißt der Delimiter (eingrenzender Tag) in der XML-Datei? my $delimiter = "<Dateiname>"; #wohin sollen die Ordner kopiert werden? my $ziel = "H:/Perl/Skripts/aa a/Zielordner"; ######################################################################### my $xmltreffer = "0"; my $fstreffer = "0"; my $timecounter = "0"; my @delarray; my @lesen; push @lesen,"$suchpfad"; while (scalar @lesen) { my $verz = shift @lesen; opendir (VERZEICHNIS,$verz) or die "$!"; foreach my $file (sort {$a cmp $b} readdir VERZEICHNIS) { if (-d "$verz/$file") { push @lesen,"$verz/$file" if $file ne '.' && $file ne '..'; } elsif ($file =~ /^$xmldatei$/) { # Durch Regex Treffer ermitteln print "XML-Datei: $file im Verzeichnis $verz\n"; print '$verz: ' . "$verz\n"; print '$file: ' . "$file\n"; open(XMLFILE, "<$verz/$file") || die "XML-Datei: $!"; while (<XMLFILE>) { #wenn Tag "<Dateiname> gefunden wird if ($_ =~ "<Dateiname>") { $xmltreffer++; #entferne den / des schließenden Tags $_ =~ s/\///; #splitte nach <Dateiname> --> [<Dateiname>][filename] [<Dateiname>] my @split = split(/<Dateiname>/, $_); #loope, solange es die Datei, die jetzt im XML-Dokument gefunden wurde nicht auch im FS gibt mit einem timeout von x Sekunden. while (!(-e "$verz/$split[1]") && ($timecounter<=300)) { print "$verz/$split[1] nicht gefunden.\n"; sleep(1); $timecounter ++; } # falls die Datei mittlerweile existiert if (-e "$verz/$split[1]") { $fstreffer++; } $timecounter = "0"; } } close (XMLFILE); if (($xmltreffer eq $fstreffer) && ($xmltreffer ne 0)) { #copy($File::Find::dir , $ziel); print "kopiere $verz/*\n"; #splitte das aktuelle Verzeichnis, in $array[-1] (am Ende) befindet sich dann z.B. S455_00015653 my @array = split(/\//, $verz); #print "$array[-1]\n"; opendir(IN,"$verz") || die $!; my @dirarray=readdir(IN); close IN; foreach(@dirarray) { if ($_ ne "." && $_ ne "..") { print "$_\n"; mkdir("$ziel/$array[-1]") unless (-e "$ziel/$array[-1]"); move("$verz/$_", "$ziel/$array[-1]") or die "File move: $!"; } } push(@delarray, "$verz"); } } } closedir VERZEICHNIS; } foreach(@delarray) { rmdir $_ || die "remove dir: $!"; }
rmdir("$_") || die "remove dir: $!";
1 2 3 4 5 6
# logisch verknüpft if ( $want_read || $must_read ) { # Flusskontrolle open my $fh, '<', $filename or die "$!\n"; ... }
Guest werIch würde mal behaupten, dass Perl erst alle Referenzen auf ein Handle entfernt wenn das Programm den Geltungsbereich verlässt, oder überschrieben wird, was bei lexikalischen Handles erst am Ende des Programms ist.
open FH ,'<',$datei
open FH, '<', $file ...
open my $fh, '<', $file
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#!/usr/bin/perl use strict; use warnings; sub my_open { open FH, '<', $0 or die $!; } sub my_read { print scalar <FH>; } my_open(); my_read(); __END__
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#!/usr/bin/perl use strict; use warnings; sub my_open { open my $fh, '<', $0 or die $!; } sub my_read { print scalar <$fh>; } my_open(); my_read(); __END__