Perl Ordner suchen und öffnen

nico_wagner

Cadet 3rd Year
Registriert
Nov. 2013
Beiträge
59
Hallo,
ich soll ein Programm zur Verschlüsselung von Daten schreiben.
Dieses Programm soll ein Verzeichnis geliefert bekommen und in dieses Verzeichnis nach den Ordnern "edit" und "orig" suchen und diese öffnen und in diesen wiederum nach 3 verschiedenen Ordnern suchen und diese öffnen. Die orig-Dateien sollen in edit kopiert werden und in edit dann bearbeitet werden.
Ich habe zunächst mit der Verschlüsselung der Daten angefangen. Das habe ich schon mal fertig.
Nun versuche ich Die Geschichte mit den Ordnern. Ich bin so weit, dass die Verzeichnisse orig und edit gefunden werden, jedoch schaffe ich es nicht diese dann zu öffnen. So sieht man Programm dafür bisher aus:

Code:
print ("Enter source directory name:\n\n");
	chomp($x = <STDIN>);
	
	opendir DIR, $x or die $!;
	$h = 0;
	while( my $entry = readdir DIR ){
		@a[$h] = $entry;
		$h ++;
	}
	closedir DIR;
	$directories = join(';' , @a);
	print $directories;
	
#################################################################################################


	if($directories =~ 'orig')
	{
		$x = $x,'/orig';
		open DIR, $x or die $!;
		$h = 0;
		while(my $entry = readdir DIR)	{
			@a[$h] = $entry;
			$h++;
		}
		closedir DIR;
		$directories = join(';' , @a);
		print $directories;
			
		if($directories =~ 'perf')
		{
			$x = $x, '\perf';
			open DIR, $x, '\orig\perf' or die $!;
			$h = 0;
			while(my $entry = readdir DIR)	{
				@a[$h] = $entry;
				$h++;
			}
			closedir DIR;
			$directories = join(';' , @a);
			print $directories;
		}
	}
}

Kann mir jemand weiterhelfen? Ich habe seit letzter Woche Mittwoch erst mit Perl und sowieso mit Script angefangen, wodurch ich nicht sehr viel Erfahrung habe.
 
machs dir nicht so kompliziert
es geht ja wohl in erster linie darum, zu überprüfen, ob es das Grundverzeichnis bzw. die entsprechenden Unterverzeichnisse gibt
Das läßt sich wesentlich einfacher prüfen:
Code:
print "Enter source directory name:\n\n";
chomp($x = <STDIN>);
$x =~ s/\\$//;						#evtl eingegebenen \ am Ende entfernen

if(-e $x."\\orig\\perf"){				#Ueberpruefen, ob Quellverzeichnis existiert

	if(!(-e $x."\edit")){				#Ueberpruefen, ob edit Verzeichnis existiert - wenn nicht, anlegen
		system("mkdir $x\\edit");
	}

	if(!(-e $x."\edit\perf")){
		system("mkdir $x\\edit\\perf");		#Ueberpruefen, ob perf Verzeichnis existiert - wenn nicht, anlegen
	}

	system("cp $x\\orig\\perf\\* $x\\edit\\perf");	#Alle Dateien von orig\perf nach edit\perf kopieren
}
 
Zuletzt bearbeitet:
Danke! Das ist wirklich um einiges einfacher:)...Habe nun jedoch das Problem, dass er sagt der Befehl CP ist falsch oder konnte nicht gefunden werden... auch use File::Copy hat nichts gebracht:/
 
ja, "cp" ist ein linux befehl :)
system setzt ein systemkommando wie auf der konsole ab
auf einem Windowssystem dann
Code:
system("copy $x\\orig\\perf\\* $x\\edit\\perf");
 
Jo klappt:)...aber ne andere frage noch....warum sind da immer zwei"\\"? Und hast du eine Idee wie man diese Dateien jetzt am besten nacheinander auslesen lässt? Ich hab ja alles so weit dass die Datei richtig ausgelesen und bearbeitet wird. Jedoch immer nu eine Datei:/
 
Bestimmte Zeichen sind Steuerzeichen. Um diese korrekt darzustellen, wird ein \ vorgestellt ("escaped").
Wenn man zw. 2 ", welche ja eigentlich den String begrenzen, ein " verwenden möchte, muss man es escapen: \" - so wird es wortwörtlich dargestellt, und nicht als Steuerzeichen (was in diesem Fall den String abschließt).
Bei einem \ wird das Script also das nachfolgende Zeichen escapen. Will man jetzt eine \ darstellen, so muss man diesen ebenfalls escapen -> \\

glob ist meine Wahl wenn es darum geht, sich durch ein Verzeichnis zu arbeiten
z.B. glob("Pfad\*.txt") gibt ein Array zurück (mit allen txt Daten in diesem Pfad), welches entsprechend durchiteriert werden kann:

Code:
while(my $file = glob("$x\\edit\\perf\\*")){
	verschluesselungsfunktion($file);		#in $file steht der relative Pfad, weswegen der Pfad bei der Quellangabe nicht extra aufgeführt werden darf
}
 
Kannst du mir noch zeigen, wie ich das ganze öffne wenn es eine .zip ist? Und danach wieder speichern als .zip?
 
rumbalotte schrieb:
ja, "cp" ist ein linux befehl :)
system setzt ein systemkommando wie auf der konsole ab
auf einem Windowssystem dann
Code:
system("copy $x\\orig\\perf\\* $x\\edit\\perf");

Ja, und wozu sich unnötig auf eine Plattform festlegen, wenn Perl das auch alles mit Bordmitteln und plattform-unabhängig tun kann? Lieber die Funktion copy() aus dem File::Copy-Modul verwenden (http://perldoc.perl.org/File/Copy.html).

mkdir() gibt es in Perl ebenfalls als built-in-Funktion (oder noch besser: File::path::mkpath() ... das erstellt sogar dazwischenliegende und eventuell noch fehlende Verzeichnisebenen), und das Zusammenfügen von Pfadnamen macht man besser mit File::Spec::join().
Ergänzung ()

nico_wagner schrieb:
Kannst du mir noch zeigen, wie ich das ganze öffne wenn es eine .zip ist? Und danach wieder speichern als .zip?


Und dir würde ich mal Google ans Herz legen. Wie schwer wäre es gewesen, nach "perl open zip files" zu googlen und dann die Doku für dieses Modul (http://perldoc.perl.org/IO/Uncompress/Unzip.html) zu schmökern?
 
Zuletzt bearbeitet:
Da ich meistens im Zug sitze wenn ich am Programm bastel, ist es dank der super Verbindungsqualität nicht so einfach viel auf google zu suchen. Außerdem finde ich es persönlich besser, wenn man eine angepasste Antwort bekommt, die sich wirklich auf das bezieht was man machen möchte. Und wenn es jemanden stört soll er einfach nicht antworten.
 
Zurück
Oben