Sequa: Verzeichniss auslesen (nur Dateien)

Hallo Zusammen,

ich möchte gerne ein angegebenes Verzeichniss öffnen lassen und nach Dateien durchsuchen lassen... die Zahl der Dateien soll dann weiterverarbeitet weren... das funktioniert auch schon ganz gut, nämlich mit folgendem Code:

opendir(DIR,$verzeichniss);

foreach (readdir(DIR))
{
next if $_ eq ".";
next if $_ eq "..";
$count++;
}
closedir(DIR);

nun, in diesem Falle werden aber auch unterverzeichnisse mitgezählt ("." und ".." habe ich, wie man sieht schon ausgeschlossen)... wenn also in einem Verzeichniss 3 Dateien und 2 Unterverzeichnisse sind, so ist $count auf 5, nicht wie gewünscht auf 3...
wie bekomme ich das ding nun dazu das er mir wirklich nur datein zählt.

Schonmal Danke im Voraus,

Sequa

  1. Hallo Sequa,

    wie bekomme ich das ding nun dazu das er mir wirklich nur datein zählt.

    foreach (readdir(DIR))
    {
    next if $_ eq ".";
    next if $_ eq "..";
    next if -d $_;
    $count++;
    }
    closedir(DIR);

    -d ist ein Dateitestoperator und "-d $_" sagt: der aktuelle Eintrag ist ein Verzeichnis.

    viele Gruesse
      Stefan Muenz

    1. Hallo nochmal,

      nunächst mal fühle ich mich ein bisschen geehrt das mir der Chef persönlich antwortet ;)... aber leider funktioniert das nicht so richtig...

      opendir(DIR,$dir);

      foreach $file (readdir(DIR))
      {
      if ($file eq ".") {next;}
      if ($file eq "..") {next;}
      if ( -d "$file" ) {next;}
      print "$file<br>";
      $count++;
      }
      closedir(DIR);

      weder so, noch mit next if geht es... hab mal $file ausgeben lassen... die "." und ".." ignoriert er... danach kommen die dateien (in dem Fall .htm dateien) und dann das verzeichniss... hier "gfx" ... nur eben das soll ja das Script filtern...

      CU Sequa

      1. Hallo,

        nunächst mal fühle ich mich ein bisschen geehrt das mir der Chef persönlich antwortet ;)... aber leider funktioniert das nicht so richtig...

        opendir(DIR,$dir);

        foreach $file (readdir(DIR))
        {
        if ($file eq ".") {next;}
        if ($file eq "..") {next;}
        if ( -d "$file" ) {next;}
        print "$file<br>";
        $count++;
        }
        closedir(DIR);

        Tja, ganz ohne Dokumentationskonsultation wird dann doch nicht gehen;-)

        Da -d auf eine Dateizugreift, mußt du auch angeben, wo diese Datei genau zu suchen ist. Wenn Du also mit
        opendir(DIR,$dir);
        aud das Verzeichnis $dir zugreifst und der Dateiname $filename ist, dann müßte es
        if ( -d "$dir/$file" ) {next;}
        heißen.

        So nebenbei, da du ja überprüfen willst, ob das da ein 'echter' File ist, solltest Du -f anstelle von -d verwenden.

        Unter
        perldoc -f -X
        und
        perldoc -f readdir
        findest Du näheres.

        Grüße
          Klaus

      2. Hallo nochmal,

        nunächst mal fühle ich mich ein bisschen geehrt das mir der Chef persönlich antwortet ;)... aber leider funktioniert das nicht so richtig...

        opendir(DIR,$dir);

        besser:
        opendir DIR, $dir or die "kann Verzeichnis nicht lesen: $!";

        foreach $file (readdir(DIR))
        {

        [..]

        besser:

        my $count = 0;
        while(defined(my $file = readdir DIR)) {
          next unless -f $file;
          print $file;
          $count++;
        }

        Peter

        1. Hallo Peter,

          opendir(DIR,$dir);

          besser:
          opendir DIR, $dir or die "kann Verzeichnis nicht lesen: $!";

          foreach $file (readdir(DIR))
          {
          [..]

          besser:

          my $count = 0;
          while(defined(my $file = readdir DIR)) {
            next unless -f $file;
            print $file;
            $count++;
          }

          Alles schön und gut, nur den Kern des Problems trifft das da nicht, da $file _nicht_ der Pfad zum File ist, solange $dir nicht leer ist:-(
          Tja, oft sioeht man den Wald vor lauter Bäume, äh, den Fehler vor lauter Fehlerbehandlungen, nicht:-)

          Grüße
            Klaus

          1. Alles schön und gut, nur den Kern des Problems trifft das da nicht, da $file _nicht_ der Pfad zum File ist, solange $dir nicht leer ist:-(
            Tja, oft sioeht man den Wald vor lauter Bäume, äh, den Fehler vor lauter Fehlerbehandlungen, nicht:-)

            Du hast ja so recht ;-)

            Peter