Verzeichnisebene für Filebrowsing
Tolwin
- perl
Hallo Forum,
ich habe mit Perl einen Filebrowser geschrieben.
Das Skript öffnet per opendir das jeweils übergebene Verzeichnis und erstellt
ein Array mit den Pfaden sämtlicher Ordner und Dateien ... soweit, sogut.
Da es für eine Weboberfläsche gedacht ist, handelt es sich um ein CGI.
Es wird zu jedem Ordner/Datei ein Link erstellt, dass das Filebrowsen sich
wie im Explorer "anfühlt". Hier ein Beispiel
/.
/..
/ordner1
/ordner2
/ordner3
Jetzt möchte ich diversen Usern nur die ein Browsing auf z.B. /ordner1 zulassen.
Das habe ich wie folgt gelöst
foreach my $elem (sort keys %result) {
if($result{$elem}{isdir} == 1) {
if($elem eq ".") {
$selPath = $result{$elem}{filepath};
$selPath =~ s|(.*)\/.*$|$1|gmi;
} elsif($elem eq "..") {
$selPath = $result{$elem}{filepath};
$selPath =~ s|(.*)\/.*\/\.\.$|$1|gmi;
} else {
$selPath = $result{$elem}{filepath};
}
if (($selPath =~ m/\/ordner1/) && ($selPath =~ m/\/\.\.$/)) ) {
print "<a onclick='setVal(\"\",\"".$selPath."\"); return submitForm();' href='#'><img src='/img_directory.gif' style='border=0;vertical-align:text-bottom;margin-left:3px'><span style='margin-left:4px'>".$elem."</span></a><br>\n";
}
}
}
Es wird jetzt auch nur noch der ordner1 angezeigt, doch leider nicht mehr /.. um eine Ebene höher navigieren zu können.
Das Problem besteht natürlich auch eine Ebene unter /ordner1 , da ja entweder die 1. Bedingung mit /ordner1/ oder die 2.
mit /.. funktioniert. Mit && kann ich beide auch nicht verbinden, da ja nur eines pro Schleifendurchlauf
eintreten kann. Wie kann ich realiseren, dass nach klicken auf /ordner1 trotzdem auch noch /.. angezeigt wird?
Wenn ich unter /ordner1 zwei Ebenen tiefer gehe, steht im Pfad für /.. natürlich auch "ordner1" und es wird
angezeigt.
Ich tüftel da jetzt schon etwas länger dran rum, leider ohne Ergebnis. Vielleicht ist es ne ganz leichte Sache...
also bitte nicht "rund machen" =)
Vielen Dank und Gruß
Tolwin
Hmm,
so richtig werde ich aus Deinem Code auch nicht schlau. Aber: Schau Dir mal File::Find an sowie die Dateitestoperatoren, speziell -f (file) und -d (directory).
Dirs, die ausgeblendet werden sollen, kannst Du ja spezielle flags geben.
File::Find geht rekursiv und effektiv durch Verzeichnisbäume.
Besser finde ich ein selbst aufgestelltes Abbild der Verzeichnisstruktur. z.B. in einer ini-Datei. Damit ist ein CGI besser steuerbar. Außerdem lassen sich beliebig viele weitere Attribute unterbringen. Guck mal:
[Ordner]
title = ...
description = ...
[Ordner.Subordner]
title = ...
description = ...
usw.
use Config::IniFiles; # und so mache ich das
Hotte
Hallo Hotte,
danke für die Antwort. ich nutze schon die Operationen -f -d an dieser Stelle:
sub getFileList {
my ($path) = (shift);
my %files;
opendir(DIR, "/default/main".$path) or die "can't opendir /./default/main$path: $!";
while (defined(my $file = readdir(DIR))) {
if ($path =~ //) {
my $permpath = "/iwmnt/default/main".$path;
my $filepath = $path."/".$file;
$files{$file}{"filepath"} = $filepath;
if (-d "/iwmnt/default/main".$filepath) {
$files{$file}{"isdir"} = 1;
} else {
$files{$file}{"isdir"} = 0;
}
}
}
closedir(DIR);
return %files;
}
Alle Verzeichnisse und Dateien befinden sich dann in %result. Das gebe ich
dann per foreach Link für Link aus. An dieser Stelle möchte ich dann gerne
nur die erlaubten Verzeichnisse / Links (s. vorherigen Post) ausgeben lassen. Mir geht es weniger um den Aufbau der Datei/Verzeichnisstruktur, sondern um die Bedingung entweder /ordner1 zu erlauben und darunter auch /.. , auch wenn sich in dessen Pfad kein /ordner1 (also /ordner1/..) befindet. Dies wäre erst der Fall, wenn ich noch eine Ebene tiefer gehen würde /ordner1/subordner2/.. - dann wäre im Pfadnamen für /.. auch ordern1 enthalten, was ich ja mit der regex abfrage.
Puhhh .. hoffe, dass ich mich nun etwas deutlicher ausgedrückt habe. =)
Grüße
Tolwin