[perl] Probleme beim auslesen eines Verzeichnisse

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Wolle
Beiträge: 94
Registriert: 16.07.2003 17:49:19

[perl] Probleme beim auslesen eines Verzeichnisse

Beitrag von Wolle » 18.01.2004 13:45:11

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

Olaf Dietsche
Beiträge: 520
Registriert: 12.06.2003 23:18:50
Wohnort: Siegburg

Beitrag von Olaf Dietsche » 18.01.2004 14:00:59

Unter http://search.cpan.org/~gbarr/libnet-1.17/Net/FTP.pm bzw.

Code: Alles auswählen

man Net::FTP
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:
  • d (directory) - Verzeichnis
    - (regular) - Datei

Benutzeravatar
ckihm.deb
Beiträge: 263
Registriert: 26.12.2002 18:49:38
Wohnort: Saarbrücken

Beitrag von ckihm.deb » 18.01.2004 14:01:07

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):

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;

}  
Und hier noch die Methode mit der ich die Liste ausgegeben habe:

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;
}
Hoffe das hilft.

Gruss Christian

Wolle
Beiträge: 94
Registriert: 16.07.2003 17:49:19

Beitrag von Wolle » 18.01.2004 14:30:38

hallo,

danke für die schnelle antwort, aber wenn ls mit -l ausführe bekomme ich auch alles aus dem aktuellen verzeichnis. ich muss dann nur noch schauen, welcher eintrag ein d für directory am anfang hat, dann hab ich s au.

gruß

Antworten