Durchsuchen von Verzeichnissen kein Recht

Durchsuchen von Verzeichnissen kein Recht

am 29.09.2006 07:09:55 von MaVo

Hallo,
ich suche auf einem Laufwerk alle Dateien mit dem Namen "dieseHier.txt"
und durchsuche den Inhalt. Ich scheitere an Verzeichnissen, bei denen
ich kein Leserecht habe :-(
Hier bricht das Skript ab. Es soll aber einfach ignorieren. Ich stehe
auf dem Schlauch.
Danke!!
MaVo
use warnings;
use strict;

# Module einbinden
use IO::Dir;
use IO::File;

my $path =3D 'c:/';
my $logfile =3D "SchreibMit.txt";
my $searchFile=3D"dieseHier.txt";
my $lengthFileName=3D length($searchFile);

our $log =3D new IO::File $logfile, "w"
or error("Kann Logdatei $logfile nicht oeffnen ($!)");

#my @files =3D listdir($path, qr#[/\\][^/\\]+\.txt?$#);
my @files =3D listdir($path, $searchFile);

my $unknown =3D "Unbekannt";

foreach my $file (@files)
{
# TXT-Datei öffnen
my $txt =3D new IO::File $file, "r"
or error("Kann Datei nicht öffnen");

# Datei einlesen
my $buf =3D "";
while (!eof($txt))
{
my $bbf =3D "";
read($txt, $bbf, 1024);
$buf .=3D $bbf;
}

# ACHTUNG-Datei schließen
close($txt);

my $raute;
if ($buf =3D~ /# Dokumenttyp:+ (\w*\s*\w*)/)
{
$raute =3D $1;
}

else
{
$raute =3D $unknown;
}

$file =3D~ s/(\\$searchFile)//;

print $log $file."\n"."\t"."Dokumenttyp: "."$raute";

if ($buf =3D~ /# verantwortlich:+ (\w*\s*\w*)/)
{
$raute =3D $1;
}

else
{
$raute =3D $unknown;
}
print $log "\t"."Verantwortlich: "."$raute";

if ($buf =3D~ /# Schutzklasse:+ (\w*\s*\w*)/)
{
$raute =3D $1;
}

else
{
$raute =3D $unknown;
}
print $log "\n"."\t"."Schutzklasse: "."$raute"."\n";

}

sub listdir
{
my $dir =3D shift or return;
my $regex =3D shift || undef;

my @files;
# my $canRead=3D1;
my $handle =3D new IO::Dir($dir)
or error("sub listdir; Kann Verzeichnis $dir nicht öffnen ($!)");
# or print "Kann Verzeichnis nicht öffnen ($!)";
# $handle =3D new IO::Dir($dir)
# or $canRead=3D0;

# if($canRead == 0)
# {
# next;
# }

while (my $file =3D $handle->read)
{
next if $file =3D~ /^\./ || $file =3D~ /_vti_cnf/;

push(@files, $dir."\\".$file);
}

my @newfiles;
foreach my $file (@files)
{
if (-d $file)
{
push(@newfiles, listdir($file, $regex));
}
else
{
next if defined $regex && $file !~ $regex;

push(@newfiles, $file);
}
}
return @newfiles;

}

sub error
{
print $log "Fehler in der Skriptausführung: @_\n";
close($log);
=09
exit(1);
}

Re: Durchsuchen von Verzeichnissen kein Recht

am 29.09.2006 08:47:09 von Slaven Rezic

"MaVo" writes:

> Hallo,
> ich suche auf einem Laufwerk alle Dateien mit dem Namen "dieseHier.txt"
> und durchsuche den Inhalt. Ich scheitere an Verzeichnissen, bei denen
> ich kein Leserecht habe :-(
> Hier bricht das Skript ab. Es soll aber einfach ignorieren. Ich stehe
> auf dem Schlauch.

Du sagst doch explizit error(), und diese Funktion ruft wiederum exit
auf.

--
Slaven Rezic - slaven rezic de
babybike - routeplanner for cyclists in Berlin
handheld (e.g. Compaq iPAQ with Linux) version of bbbike
http://bbbike.sourceforge.net

Re: Durchsuchen von Verzeichnissen kein Recht

am 29.09.2006 11:16:47 von Ferry Bolhar

MaVo:

> Hier bricht das Skript ab. Es soll aber einfach ignorieren. Ich stehe
> auf dem Schlauch.

Pack den Code zum Öffnen in ein "eval" und prüfe
nachher $@:

foreach my $file (@files)
{
# TXT-Datei öffnen
eval { <-----
my $txt = new IO::File $file, "r"
or error("Kann Datei nicht öffnen");
}; <-----
nextf if $@; <----- # $@ enthält Fehlertext oder "" wenn
alles ok

Gilt natürlich auch für alle anderen I/O Operationen, bei
denen was schiefgehen kann.

BTW: Das Beispiel macht genau das, was du möchtest.
Ich würde aber zumindest irgendwo protokollieren, auf
welche Verzeichnisse nicht zugegriffen werden konnte,
und was die Ursache war:

(print STDERR "$@\n", next) if $@;

HTH & LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at