Juli: Dateiliste mit Verzeichnisangaben

Hi...

ich habe mir eine schöne CGI-Liste entworfen, die eine Dateianzeige ermöglicht, siehe jetzt folgendes Beispiel:

----------------------------------------------------------------

#!/usr/bin/perl

use CGI::Carp qw(fatalsToBrowser);
use HTML::Parser;
use HTML::Entities;

print "Content-type: text/html\n\n<html><body>";

if($ENV{'REQUEST_METHOD'} eq "GET")
 {
 $Daten = $ENV{'QUERY_STRING'};
 }
else
 {
 read(STDIN, $Daten, $ENV{'CONTENT_LENGTH'});
 }
@Formularfelder = split(/&/, $Daten);
foreach $Feld (@Formularfelder)
 {
  ($name, $value) = split(/=/, $Feld);
  $value =~ tr/+/ /;
  $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  $value =~ s/<!--(.|\n)*-->//g;
  $FORM{$name} = $value;
 }

if($FORM{'Dir'} eq "") { $Sdirectory = "h:/www/html"; }
else { $Sdirectory = "$FORM{'Dir'}"; }

$Udirectory = '';
my (@files) = ();
my (@URL) = ();
opendir (DIR, $Sdirectory) or die ("ERROR!!!");
foreach my $file (readdir(DIR))
  {
  next if /^.{1}$/;
  push (@files, $Sdirectory."/".$file)
  unless -d ($Sdirectory."/".$file);
  push (@URL, $UDirectory."/".$file)
  unless -d ($UDirectory."/".$file);
  }
print ("<TABLE>");
for($i=0;$i<@files;$i++)
 {
 print "<tr><td><a href="",$URL[$i],"" target="_new">",$files[$i],"</a></td></tr>";
 }
print ("</TABLE>");
print ("</body></html>");

----------------------------------------------------------------

So, diese Liste ermöglicht einem das Ausgeben aller Dateien auf einem Server. Dummerweise ermöglicht sie nicht das Auslesen der Verzeichnisse, so zeigt sie der Person diese nicht an.

Könntet ihr mir meinen kleinen Patzer korrigieren?

CU

Juli

P.S.: Ich habe die vollständige Datei ausgegeben, damit alle die Interesse haben, sich holen können. Ich werde auch, wenn ihr wollt die fertige Datei hier "veröffentlichen" (bloß ohne Änderungen im Styling, das macht ihr dann selber).

  1. Hi auch,

    So, diese Liste ermöglicht einem das Ausgeben aller Dateien auf
    einem Server.

    Keineswegs. Nur die Ausgabe aller Dateien eines Verzeichnisses.

    Dummerweise ermöglicht sie nicht das Auslesen der Verzeichnisse,
    so zeigt sie der Person diese nicht an.

    Eben.

    Könntet ihr mir meinen kleinen Patzer korrigieren?

    Hm - ein 'kleiner' Patzer ist das nun leider nicht, sondern Du kannst
    leider einen große Teil Deines Konzepts 'entsorgen', weil Dein Konzept
    den gestiegenen Anforderungen nicht mehr gerecht wird.

    Zunächst einmal: Bisher trennst Du zwischen Einlesen und Verarbeiten
    der Verzeichniseinträge. Das wirst Du aufgeben müssen, wenn Du Unter-
    verzeichnisse analysieren möchtest. Deine bisherige Speicherstruktur
    (eindimensionaler Array) reicht für *ein* Verzeichnis, aber für einen
    ganzen Verzeichnisbaum nicht. Und statt eine komplexe Datenstruktur
    aufzubauen (und womöglich einen riesigen Baum komplett in den Speicher
    zu laden), ist es sinnvoller, den Baum während des Traversierens
    schrittweise abzuarbeiten und jeweils sofort die Ausgabe zu erzeugen.
    (Dann brauchst Du überhaupt keine Zwischenspeicherung der Daten.)

    Als nächstes: Du fragst "unless -d" ab, nimmst also alles außer Ver-
    zeichnissen. (symbolic links? devices?)
    Das ist die Stelle, an der Du ansetzen müßtest: Ein "if" mit dem bisher
    vorhandenen Code im Positiv-Zweig und im "else"-Zweig dann ein - hm, wenn
    Dein Code jetzt eine Funktion wäre, welche als Parameter den Pfad zu dem
    zu analysierenden Verzeichnis bekommen hätte, dann könntest Du diesen Pfad
    jetzt (um den Namen des gerade entdeckten Unterverzeichnisses verlängert)
    an einen rekursiven Aufruf dieser Funktion übergeben.
    Statt dessen kannst Du aber auch einen vordefinierten Verzeichnis-
    Traversierer-Modul verwenden: File::Find. Mit dem kannst Du dann Deine
    bisherige einfache Schleifenstruktur beibehalten. (Der macht allerdings
    vermutlich das, was ich oben bedenklich fand, nämlich zwischenspeichern,
    saut also bei großen Bäumen mit der Speichernutzung herum.)

    Und schließlich: Dein Ausgabeformat ist eine Tabelle. Diese besitzt
    endlich viele Spalten. Ich vermute, Du willst den Inhalt der Unterverzeich-
    nisse ähnlich wie im Windows-Dateiexplorer eingerückt aufgelistet bekommen.
    Das wird Dir erhebliche Probleme bereiten. Theoretisch kannst Du pro Ver-
    zeichnisebene um ein <td width="10">&nbsp</td> einrücken, d. h. vor jedem
    Eintrag ein <td> mit entsprechendem colspan und Breitensumme generieren und
    dahinter dann ein <td> mit dem restlichen colspan bis zur Gesamtbreite der
    Tabelle. Aber woher weißt Du vorher schon die maximale Schachtelungstiefe,
    d. h. die Menge der insgesamt erforderlichen Spalten? Das ist ein echtes
    Problem ...
    Insofern dürfte eine Auflistung mit geschachtelten <ul> / <li> flexibler
    und für Deinen Zweck praktischer sein.
    (Siehe auch: http://www.homepage.de/home/schroepl/_sitemap/ - wird
     mit Perl statisch generiert und zusammen mit den geänderten Seiten per
     FTP hochgeladen)

    Viele Grüße
          Michael

  2. Tach!

    ich habe mir eine schöne CGI-Liste entworfen, die eine Dateianzeige ermöglicht, siehe jetzt folgendes Beispiel:

    Aha, selber entworfen, ja? Irgendwie glaub ich da nicht dran. Du darfst das hier ruhig auch sagen, wenn Du Hilfe bei der Anpassung eines gefundenen Scripts brauchst. *g*

    So long

    1. Hi

      Tach!

      ich habe mir eine schöne CGI-Liste entworfen, die eine Dateianzeige ermöglicht, siehe jetzt folgendes Beispiel:

      Aha, selber entworfen, ja? Irgendwie glaub ich da nicht dran. Du darfst das hier ruhig auch sagen, wenn Du Hilfe bei der Anpassung eines gefundenen Scripts brauchst. *g*

      Die Hilfe habe ich benötigt, ansonsten wäre es gar nicht fertig. Und jetzt mal ganz dumm: Ohne Hilfe könnte ich gar nicht programmieren.
      Manche Scripts, wie z.Bsp. ein News-Script habe ich beispielsweise mal im absoluten Eigenbau gemacht

      So long

      CU

      Juli