[PHP] ftp (unter)verzeichnisse auslesen

benny17

Commander
Mitglied seit
24.10.2003
Beiträge
157
Renomée
0
Moin,

ich habe folgendes vor: ich möchte täglich eine Datensicherung meines FTP Servers durchführen, da täglich neue daten hinzukommen und ich sie als sicherung bei mir lokal haben möchte und nicht nur beim hoster. also woltle ich mir ein php script basteln, dass ich jeden morgen einmal starte und es per ftp zugriff die daten ausliest und auf meine platte runterlädt

was ich shcon hinbekommen habe:
- ftp verbindung herstellen
- ins richtige verzeichnis wechseln
- zwischen dateien und ordnern unterscheiden
- dateien runterladen und in bestimmten zielverzeichnis speichern

was ich noch nicht hinbekommen habe:
- unterverzeichnisse auslesen

unterverzeichnisse können ja x-beliebig tief gehen und ich habe keine ahnung, wie ich das realisieren soll. demnach müsste ich doch etliche schleifen untereinander schachteln, die immer wieder zwischen ordner und datei entscheiden, wenns ein ordner ist, reingehen und wieder zwischen ordnern und datei entscheiden. und die dateien ebent runterladen.
glaub ich mach mir das viel zu kompliziert :)

hier mal mein code, bisher:
Code:
<?

function get_file_list($path) {
	
	//Logindaten:
	$ftp_server="xxx";
	$ftp_user_name="xx";
	$ftp_user_pass="xxx";
	
	$conn_id = ftp_connect("$ftp_server"); 
	$login_result = ftp_login($conn_id, "$ftp_user_name", "$ftp_user_pass"); 
	ftp_pasv($conn_id, true);
	
		$file_list = ftp_nlist($conn_id, ""); 
		sort($file_list);
		
		// Liste wird ausgelesen und jeder Teil des Arrays ind Variable $file geschrieben
		foreach($file_list as $file) {
			
			// Filegröße wird überprüft. Ordner = -1
			$file_size=ftp_size($conn_id, $file);
			
			// Wenn Filegröße = -1 (Ordner), dann...
			if ($file_size=='-1') {
				// Wenn Filename ungleich ".." ist (als ein normaler Ordner ist), dann...
				if ($file!=='..') {
					$newpath = $path."/".$file;
					get_file_list($newpath);
					
				}
			}
			// Wenn Filegröße ungleich -1 (also Datei), dann
			else {
				//$download=ftp_get($conn_id, "Datensicherung/".$file, $file,  FTP_BINARY);
				echo $file." erfolgreich runtergeladen!<br />";
				
			}
			ftp_quit($conn_id); 
		}
		
	}
	
	
	get_file_list("xxx");
	
?>


//edit: habs nun slebst ansatzweise hinbekommen, indem ich das als funktion geschrieben habe und ich die funktion sich selbst aufrufen lasse. dann bekomme ihc jedoch einen error, dass nur 6 verbindungen zugelassen sind. logisch, dass er dann abbricht, weil in der funktion ja jedesmal die verbindung hergetsellt wird. aber wenn ich den login vor die funktion schriebe,haut dsas auch net hin....
wäre dankbar für ein paar tipps :)!
 
Zuletzt bearbeitet:
Tach,

//edit: habs nun slebst ansatzweise hinbekommen, indem ich das als funktion geschrieben habe und ich die funktion sich selbst aufrufen lasse. dann bekomme ihc jedoch einen error, dass nur 6 verbindungen zugelassen sind. logisch, dass er dann abbricht, weil in der funktion ja jedesmal die verbindung hergetsellt wird. aber wenn ich den login vor die funktion schriebe,haut dsas auch net hin....
wäre dankbar für ein paar tipps :)!
Erstelle die Verbindung nicht bei jedem Schleifendurchlauf neu, sondern nur einmal beim start außerhalb der Funktion. Der Funktion übergibst du dann die Verbindungs ID.

Bye
Phil
 
jo, habs nun hinbekommen, danke. ein fehler war auch noch, dass ich nach dem rekursiven funktionsaufruf nicht wieder eine vcerzeichniseben höher gegangen bin.
 
//edit: habs hinbekommen.....ein letzten versuch hab ich noch gemacht und da hats geklappt...:)

so, nächstes problem :)

das mit dem rekursiven auslesen und runterladen habe ich hinbekommen. ich möchte nun noch, dass ich die Dateinamen in einem Array speichern kann, ganz am ende alühabetisch sortieren und in eine textdatei schreiben. so, das einzige was mir probleme bereitet, ist die werte in ein session array (da ich eine gesonderte datei für die funktionen habe) zu schreiben. dadurch, dass ich das ganze rekursiv behandel, habe ich im array nachehr manche werte doppelt. ich hab zig varianten getestet, ich poste jetzt einrfach mal meine funkjtionieredne funktion für das rekursive downloaden vom ftp server (ohne session array...). vielleicht kann mir dann ja jemand einen tipp geben, wie und wo ich was korrekt einfügen muss, um die werte (einmalig) in die session zu schreiben. könnte ich sonst auch umständlich vor jedem hinzufügen, kucken, ob der wert shcon im array vorhanden ist, und nur wenn nicht, den wert hinzufügen...?! bin grads ziemlich ratlos
Code:
	function get_file_list($path, $conn_id) {		

		
		ftp_chdir($conn_id, $path); // ordnerwechsle auf ftp
		if(!is_dir($path)) {mkdir($path);} // wenn nicht vorhanden, lokalen ordner erstellen
		chdir($path); //wechsel in diesen ordner
		$file_list = ftp_nlist($conn_id, ""); 
	 	asort($file_list);

				
		// Liste wird ausgelesen und jeder Teil des Arrays ind Variable $file geschrieben
		foreach($file_list as $file) {
			
			// Filegröße wird überprüft. Ordner = -1
			$file_size=ftp_size($conn_id, $file);

			// Wenn Filegröße ungleich -1 (also Datei), dann
			if ($file_size>"-1") {
				
				$download=ftp_get($conn_id, $file, $file,  FTP_BINARY);
			}
			
			// Wenn Filegröße = -1 (Ordner), dann...
			else {
				// Wenn Filename ungleich ".." ist (als ein normaler Ordner ist), dann...
				if ($file!=='..' && $file!=='.') {
					$_SESSION['ordner']++;
					get_file_list($file, $conn_id);
					
					ftp_cdup($conn_id);
					chdir("..");
				}
				
			}
		}
	}
 
Zuletzt bearbeitet:
Zurück
Oben Unten