FTP Client -Probleme beim Downlaod von Files

Steffen01

Mitglied
HI,
ich habe folgendes Problem:

Ich verwende den FTPClient 'org.apache.commons.net.ftp.FTPClient'.

Diese Klasse in der der FTPClient definiert ist, macht folgendes:

Es wird überprüft ob auf dem FTP-Arbeitsverzeichnis (Server) Zip-Dateinen vorliegen. Wenn ja werden die Zip-Dateien gedownloadet.

Das Downloaden funktioniert sowiet tadellos. :)

Ich bekomme dann ein Problem wenn gerade auf das FTP-Arbeitsverzeichnis eine neue Zip-Datei geschrieben wird. Der FTPClient downloadet das Zip, obwohl das Zip gerade geschrieben wird, unvollständig herunter.

Es wird auch keine Exception geworfen.

Wüßte jemand eine Lösung für mein Problem oder einen anderen FTPClient?

Ich bedanke mich im Voraus.
Grüße Steffen
 
Haben die zip files eine mind. größe?n Wenn ja kannst du ein fttpconnection objekt nutzen um die größe abzufragen. Wenn die dann unter der mind. größe ist, darfste net downloaden...
 
Nein die haben keine Mindestgröße.
Auch wenn ich eine Mindestgröße hätte, wäre das Problem ja immer noch da, denke ich.

Kannst du mir sagen warum keine Sperre auf dem File liegt, da es ja gerade geschrieben wird?
 
eventuell musst du ein
Code:
ftp.completePendingCommand()
durchführen um den upload abzuwarten... uploadest du es mit store oder storefilestream?
 
Also ich Uploade noch mit FileZilla zum Testen wie sich der Download verhält.

Der Download wird mit
Code:
out = new FileOutputStream(String);
ftp.retrieveFile(FileName, out);

ausgeführt.
 
Ja, das ist doof. Files werden auf dem ftp nicht gesperrt. Stell dir vor, es werden log files (Analyzer o.ä) geschrieben, die werden ständig geschrieben, die könntest du dann ja nie herrunterladen.
Du wirst so keine Möglichkeit haben, zu checken ob die Datei fertig hochgeladen ist, zumindest wenn du einen anderen Prozess als storeFile von Java aus nutzt, Wie auch?

Die einzige Möglichkeit, die mir einfällt ist ganz schön dreckig und wahrscheinlich auch etwas unperformant, aber sie würde gehen.

Bau einfach eine Methode, die solange die größe der entsprechenden Datei checkt, bis sie 2-3 mal hintereinander gleich war. Zwischen dem check läßt du immer 250 ms oder so vergehen.

Wie gesagt, ist eher eine unschöne Vorgehensweise, aber es würde gehen. So etwas in diesem Stil mein ich:

Java:
	private void checkFTPFile(){
		URLConnection con = null;
		
		long size_new = 0;
		long size_old = 0;
		
		long tmp = 0;
		
		boolean initialRun = true;
		int isGleich = 0;
		while(true){
			try {
				con = new URL("http://www.test.de/testdatei.zip").openConnection();
				tmp = con.getContentLength();
				
				if(size_old==0)
					size_old = tmp;
				
				size_new = tmp;
				
				if(size_new!=size_old && !initialRun){
					size_old = con.getContentLength();
					System.out.println("Upload noch nicht fertig --> Warte");
					isGleich = 0;
					try {Thread.sleep(250);} catch (InterruptedException e) {Thread.currentThread().interrupt();};
				}else{
					if(isGleich!=3)
						isGleich++;
					else{
						System.out.println("Fertig, gogogo!!");
						return;
					}
				}
				initialRun = false;
			} catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		}
	}
 
Die Idee mit der Prüfung ist super.

Da ich jetzt aber ein neue Kenntis über die Eigenschaften der Dateien auf dem Web-Server habe, werde ich das anderst lösen.

Und zwar, wenn das Zip erstellt wird, endet es erst mit *.zip_temp.
Somit downloadet mein Client diese Datei nicht.
Wenn das Zip vollständig geschrieben wurde änder ich den Namen um in *.zip
und der Download kann anfangen.

Danke schön für die Hilfe und Lösung.
 
Zurück