# Perl - Verzeichnisinhalt ausgeben



## Mirar (26. Januar 2012)

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:


```
#!/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:


```
$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


----------



## deepthroat (26. Januar 2012)

Hi.

Es gibt ein extra Forum für Perl Fragen => http://www.tutorials.de/cgi-perl-python-ruby-power-shell/

Du solltest grundsätzlich prüfen ob opendir erfolgreich war. Offenbar hat das nicht geklappt...


```
if (!opendir(DIR, $path)) {
  print "error: could not open $path";
} else {
  ...
}
```
Gruß


----------



## Mirar (27. Januar 2012)

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


----------



## deepthroat (27. Januar 2012)

Mirar hat gesagt.:


> Guten Morgen,
> 
> ich hab den Code jetzt angepasst und bekomme dann auch gesagt das es nicht geklappt hat. Aber wieso hat es nicht geklappt?


Was genau wird denn ausgegeben?

Ist der Pfad auch wirklich ein Verzeichnis?

Hat der Prozess Leserechte in dem Verzeichnis?

Gruß


----------



## Mirar (27. Januar 2012)

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

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


----------



## deepthroat (27. Januar 2012)

Dann versuch doch mal folgendes:

```
opendir(DIR, $path) || die $!;
```
Was kommt als Fehlermeldung?

Gruß


----------



## deepthroat (12. März 2013)

princelee1019 hat gesagt.:
			
		

> Ist der Pfad auch wirklich ein Verzeichnis?


Ist hier ein Echo?

Nebenbei, der Thread hat schon einen Bart und interessiert keinen mehr - vor allem nicht den Autor, sonst hätte er schon damals geantwortet.


----------

