Dateiliste mit Verzeichnisangaben
Juli
- perl
0 Michael Schröpl0 Calocybe0 Julian
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).
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"> </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
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
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