hallo,
habe ein problem mit perl.
ich nutze das modul Net::FTP um mich auf einen server einzuloggen. ich will dort in ein verzeichnis wechseln und mir die liste der darin enthaltenen verzeichnisse in ein array schieben lassen und das ist das problem, ich bekommen nur die dateiliste zurück.
gibt es eine möglichkeit, sich die verzeichnisliste zurückgeben zu lassen.
in diesem sinne
wolle
[perl] Probleme beim auslesen eines Verzeichnisse
-
- Beiträge: 520
- Registriert: 12.06.2003 23:18:50
- Wohnort: Siegburg
Unter http://search.cpan.org/~gbarr/libnet-1.17/Net/FTP.pm bzw. bekommst du eine detaillierte Liste der vorhandenen Methoden.
Die Methoden ls() oder dir() liefern eine Liste der Zeilen, die vom Server kommen. Darin sind üblicherweise Dateien und Verzeichnisse enthalten. Du kannst Dateien und Verzeichnisse anhand der ersten Spalte unterscheiden:
Code: Alles auswählen
man Net::FTP
Die Methoden ls() oder dir() liefern eine Liste der Zeilen, die vom Server kommen. Darin sind üblicherweise Dateien und Verzeichnisse enthalten. Du kannst Dateien und Verzeichnisse anhand der ersten Spalte unterscheiden:
- d (directory) - Verzeichnis
- (regular) - Datei
Hallo,
ich habe mir mit dem Modul mal einen FTP-Client geschrieben. Um das Listing der Verzeichnisse
zu erleichtern, habe ich noch das Modul
File::Listing
benutzt. Hier die Methode mit Erklärung zum Auflisten (das umschreiben überlasse ich dir):
Und hier noch die Methode mit der ich die Liste ausgegeben habe:
Hoffe das hilft.
Gruss Christian
ich habe mir mit dem Modul mal einen FTP-Client geschrieben. Um das Listing der Verzeichnisse
zu erleichtern, habe ich noch das Modul
File::Listing
benutzt. Hier die Methode mit Erklärung zum Auflisten (das umschreiben überlasse ich dir):
Code: Alles auswählen
use Net::FTP; # FTP-Protokoll-Modul aus dem CPAN
use File::Listing; # erleichtert das Parsen der Verzeichnisse
# OOOooo... _dir ...oooOOO
#
sub _dir {
my $object = shift;
#_____________________________________________________________________#
#___________________...oooOOO°|Net::FTP|°OOOooo...____________________#
# #
# dir ( [ DIR ] ) #
# #
# Liefert das Directory-Listing für DIR oder das aktuelle Verzeichnis #
# auf dem FTP-Server zurück. Je nach Kontext wird eine Liste oder #
# eine Referenz auf eine Liste mit Dateinamen zurückgegeben. #
# Es wird das lange Format (Datum, Dateigrössen etc) verwendet. #
# #
# Benutzt man anstatt dir ( [ DIR ] ) das Kommando ls ( [ DIR ] ), #
# wird statt dem langen Format, das Kurze (nur Name) zurückgegeben. #
# #
# Um diese Liste leichter darstellen zu können benutzte ich das #
# Modul File::Listing. #
# #
#_____________________________________________________________________#
#°°°OOOooo...______________|Modul Net::FTP|_______________...oooOOO°°°#
return "\n\nEs gibt keine Aktive Sitzung"
unless &_exist_Session($object, $aktiv_host);
# Skalarer Kontext für parse_dir()
# liefert eine Referenz auf ein Array von Arrays
my $ref_Filelist = parse_dir($object->{$sessions[$aktiv_host]}->{"session"}->dir());
return $ref_Filelist;
}
Code: Alles auswählen
# OOOooo... print_Filelist ...oooOOO
#
# Gibt eine Formatierte Verzeichnisliste aus
sub print_Filelist{
my ($object, $ref_Filelist) = @_;
#_____________________________________________________________________#
#________________...oooOOO°|File::Listing|°OOOooo...__________________#
# #
# File::Listing erleichtert das Parsen der Verzeichnislisten #
# von FTP-Servern. #
# #
# parse_dir(DIR) #
# #
# Die Routine parse_dir() versteht nur Verzeichniseinträge im #
# Unix "ls-l" bzw. "ls -lR" Format. Dieses Format wird von den #
# meisten FTP-Servern (unabhängig vom Betriebssystem) verwendet. #
# parse_dir liefert eine Referenz auf einen Array von Arrays #
# im Format #
# #
# ($name, $type, $size, $mtime, $mode) #
# #
# für jeden Verzeichniseintrag zurück. #
# #
# $name #
# Name der Datei bzw. des Verzeichnisses #
# #
# $type #
# 'f' einfach Datei #
# 'd' Verzeichnis #
# 'l' Link. Häufig wird noch der 'echte' Name angehängt. #
# '?' unbekannt #
# #
# $size #
# Die Grösse der Datei in bytes #
# #
# $mtime #
# Zeitunkt der letzten Änderung in Unixsekunden #
# #
# $mode #
# Zugrifsmodus in Dezimalform #
#_____________________________________________________________________#
#°°°OOOooo...____________|Modul File::Listing|____________...oooOOO°°°#
&newline;
print $dateiliste_Kopf;
# subtrahiere die Anzahl ausgegebener Zeilen von der Variable
# $- ($FORMAT_LINES_LEFT), damit der Seitenkopf an der richtigen
# Stelle kommt
$- -= 4;
foreach my $ref_Filelist (@$ref_Filelist) {
my ($name, $type, $size, $mtime, $mode) = @$ref_Filelist;
# keine PunktDateien
next if ($name =~ /^\./);
# 1. Dezimal umwandeln in Oktal
# 2. Nur die letzen 3 Stellen interesieren(755 statt 100755)
# 3. Umwandeln in die Form 'rwxr-xr-x'(=: 755)
$mode = &get_MODEString(substr(sprintf("%o",$mode),-3));
# Die Zeit wird in Millisec. zurückgegeben (schwer zu lesen ;o)
# Daher benutze ich die Funktion gmtime() um das Datum zu
# Formatieren
my ($sek, $min, $std, $tag, $mon, $jahr) = gmtime($mtime);
#
# rechtsbündig, 2 Stellen, mit 0 aufgefüllt
$tag = sprintf("%02d", $tag);
$mon = sprintf("%02d", $mon + 1);# Jan = 0, daher + 1
#
$jahr += 1900; # jahr = Jahre seit 1900, daher + 1900
#
# weshalb ich hier die 2 addieren muss damit die Stunden
# stimmen weiss ich nicht, aber so stimmt die Zeit ;-(
$std += 2;
#
# Kompletter String in der Form 'DD.MM.YYYY hh:mm'
my $timeStamp = "$tag.$mon.$jahr $std:$min";
# Parsen ob es sich um ein Verzeichnis od. eine 'Datei'
# od. einen Link handelt
if ($type eq 'd') {
$type = "VERZ.";
} elsif ($type eq 'f') {
$type = "Datei";
} elsif ($type =~ s/^l//) {
$type = "Link";
} elsif ($type eq '?') {
$type = "???";
}
printf " Û %-5s: %-25s %10s %16s %9s Û\n",
$type, $name, $size, $timeStamp, $mode;
$- --;
}
print $dateiliste_Fuss;
$- -= 4;
}
Gruss Christian