Perl - Verzeichnisinhalt ausgeben


#1
Hallo Leute,

ich habe bei meinem Programm leider ein Problem. Es handelt sich bei dem Programm um eine Fernsteuerung für einen Server im Netzwerk über die Konsole. Das ganze ist in Perl geschrieben. Soweit funktioniert auch alles. Ich kann Befehle beim Client eingeben und der Server führt diese aus und schickt die Ausgabe zurück.

Ich will das ich wenn ich einen "cd ..." Befehl eingegeben habe, der Server mir alle VERZEICHNISSE im aktuellen Verzeichnis ausgibt. Und genau an der Stelle scheitert es. Das Verzeichnis wird zwar gewechselt aber statt der erwarteten Ausgabe bekomme ich folgendes:

readdir() attempted on invalid dirhandle DIR at ServerNeu.pl line 63, <GEN1> line 1.
closedir() attempted on invalid dirhandle DIR at ServerNeu.pl line 68, <GEN1> line 1.


Hier mal mein Code für den Server:

Perl:
#!/usr/bin/perl -w
 
use strict;
use IO::Socket;
use Cwd;
use File::Basename;

my $port = $ARGV[0];
unless (defined($port)) {
	print "Geben Sie den Port an...\n"; 
	$port = <STDIN>;
}
chomp($port);

my $server = IO::Socket::INET->new(
    LocalPort    => $port,
    Type         => SOCK_STREAM,
    ReuseAddr    => 1,
    Listen       => 10 )
    or die "Couldn't be a tcp server on port $port : $@\n";
 
print "Server started\n";

my $client = $server->accept( );

my $output;
my $dir;
my $directory;
my $command;
my $datei;

while(1) {
	$command = <$client>;
	
	if(substr($command, 0, 3) eq "cd ") {	
	
		$dir = substr($command, 3, length($command));
		$dir =~ s/\n+$//;
		
		if(chdir($dir) == 1) {
			$output = "Changed directory";
		} else {
			$output = "Couldn't change directory"; 
		}
		
		$directory = cwd();
		my $path = dirname($dir)."/".basename($dir);
		
		print "\nDirectories in this directory:\n";
		
		opendir(DIR, $path);
		while($datei = readdir(DIR)) { 
			if(-d $datei && $datei ne "." && $datei ne "..") {
				print $datei."\n" 
			}
		}
		closedir(DIR);
		
		
		
	} elsif($command eq "end\n") {
		close($server);
		print "Shut down Server";
		last;	
	} else {
		$output = qx($command);
	}
	
	print $client $output."\nEOC\n";
}
Und hier für die bessere Übersicht die Codestelle die für den Ordnerwechsel und die Ausgabe zuständig ist:

Perl:
$command = <$client>;
	
	if(substr($command, 0, 3) eq "cd ") {	
	
		$dir = substr($command, 3, length($command));
		$dir =~ s/\n+$//;
		
		if(chdir($dir) == 1) {
			$output = "Changed directory";
		} else {
			$output = "Couldn't change directory"; 
		}
		
		$directory = cwd();
		my $path = dirname($dir)."/".basename($dir);
		
		print "\nDirectories in this directory:\n";
		
		opendir(DIR, $path);
		while($datei = readdir(DIR)) { 
			if(-d $datei && $datei ne "." && $datei ne "..") {
				print $datei."\n" 
			}
		}
		closedir(DIR);
	}
Ich hoffe ihr könnt mir helfen!

Danke im Voraus

Gruß Mirar
 
#3
Guten Morgen,

ich hab den Code jetzt angepasst und bekomme dann auch gesagt das es nicht geklappt hat. Aber wieso hat es nicht geklappt? Im Internet lese ich immer nur DIR ist kein Filehandle. Was soll das heißen? Es ist doch soweit ich weiß egal was ich da hinschreibe!?

Gruß Mirar
 
#5


error: could not open C:\Dokumente und Einstellungen\User\Desktop\Spielwiese

Ja das ist definitiv ein Pfad und die Leserechte besitzt er auch.
 

Neue Beiträge