German FTP List

fabs222

Member
Licensed User
Longtime User
Hallo,

ich würde es gerne hinbekommen, dass mein App sich per FTP mit dem Server verbindet, dann "schaut" ob Datein vorhanden sind und wenn ja diese dann ALLE in den Ordner Bilder downloaded. Mit dem FTP Server verbinden bekomme ich hin, auch das herrunterladen einzelner Datein (wenn ich den Namen weiß). Aber das ganze automatisch und ohne angabe von Dateinamen bekomme ich nicht hin:sign0148:. Irgendwie scheitere ich schon am FTP.List. Am Serverlog sehe ich das der User (also das App) sich eingelogt hatt und dann kommt (Data session connected. Error #10060)
Das hier habe ich bis jetzt:


PHP:
Sub Process_Globals
   Dim FTP1 As FTP
   Dim timerview As Timer

End Sub

Sub Globals
   Dim exRoute As String 
   Dim List1 As List
   Dim FileNumber As Int 
   Dim FileCount As Int
   Dim ImageView1 As ImageView 
   
End Sub

Sub Activity_Create(FirstTime As Boolean)
   Activity.LoadLayout("aa")
   FTP1.Initialize("FTP", "192.168.1.110", 21, "1", "1")
   FTP1.List("")
   timerview.Initialize("timerview",5000)
   FileCount =0
    List1.Initialize        
   exRoute = ("/LocalDisk/Bilder")
   List1 = File.ListFiles (exRoute )
   If List1.Size > 0 Then
   FileCount = List1.Size 
   FileNumber =-1
   timerview.Enabled = True
   End If
End Sub

Sub FTP1_ListCompleted (ServerPath As String, Success As Boolean, Folders() As FTPEntry, Files() As FTPEntry)
Log(ServerPath)
If Success = False Then
Log(LastException)
Else
For i = 0 To Folders.Length - 1
Log(Folders(i).Name)
Next
For i = 0 To Files.Length - 1
Log(Files(i).Name & ", " & Files(i).Size & ", " & DateTime.Date(Files(i).Timestamp))
Next
End If
End Sub


Sub timerview_tick
   Dim sFile As String 
   FileNumber = FileNumber + 1
   If FileNumber +1 > FileCount Then      
   FileNumber=0
   End If
   sFile= List1.Get (FileNumber)
   ImageView1.Bitmap=LoadBitmap(exRoute,sFile)
End Sub
 
Last edited:

Kiffi

Well-Known Member
Licensed User
Longtime User
FTP.List() wird asynchron ausgeführt. D.h., nach Ausführen des Befehls kann
es mehr oder minder lange dauern, bis die Dateiliste auf Deinem Device
angekommen ist. In diesem Fall wird dann FTP_ListCompleted() ausgeführt.

Also: Zuerst FTP.List() ausführen und dann erst in FTP_ListCompleted()
weitermachen.

Mein Vorschlag: Lass erst einmal Timer & Co weg (das lenkt vom eigentlichen
Problem ab) und versuch, die FTP-Liste korrekt zu empfangen. Wenn das
klappt, dann können wir weitersehen.

http://www.b4x.com/forum/basic4android-getting-started-tutorials/10407-android-ftp-tutorial.html hast Du sicherlich ja schon gesehen.

Grüße ... Kiffi

P.S.: Tu uns und Dir den Gefallen und rück Deinen Code mal ein wenig ein.
Dadurch wird er wesentlich lesbarer.
 

kaplanerkan

Member
Licensed User
Longtime User
Sorry, ich habe eine andere Frage bzw. eine Zwischenfrage bezuglich folgende Zeile:

B4X:
 FTP1.Initialize("FTP", "192.168.1.110", 21, "1", "1")

Muss man immer mit IP-Adresse definieren oder kann er auch Namen verstehen , wenn alle Clients im LAN Ihre IP-Nummer über DHCP-Server bekommen?

B4X:
 FTP1.Initialize("FTP", "Server", 21, "1", "1")


danke
 

Kiffi

Well-Known Member
Licensed User
Longtime User
oder kann er auch Namen verstehen
ja, das geht auch. Voraussetzung ist allerdings, dass der Name mit einer IP
verbunden ist. Sowas muss dann der DNS-Server auflösen.

Beispiel: ftp.free.fr -> 212.27.60.27

Grüße ... Kiffi
 

fabs222

Member
Licensed User
Longtime User
Hallo Kiffi,

ich werde heute abend mal alles bis auf die FTP rausschmeißen (und den Code einrücken).

Was mir noch aufgefallen ist ist, dass ich die Fehlermeldung am FTP Server nur bekomme wenn ich das App im Emu ausführe. Mache ich das über das Tablet bekomme ich keine Fehlermeldung am Server.

Was ich nur noch nicht begriffen habe ist, wenn das Tablet die FTP.List empfangen haben sollte, wo sehe ich das bzw. wie kann ich mir die dann anzeigen lassen?


Liebe Grüße

fabs222
 

Kiffi

Well-Known Member
Licensed User
Longtime User
wenn das Tablet die FTP.List empfangen haben sollte, wo sehe ich das bzw. wie kann ich mir die dann anzeigen lassen?
dann wird FTP_ListCompleted() ausgeführt. (Hast Du ja auch in Deinem Code so stehen).

Grüße ... Kiffi
 

fabs222

Member
Licensed User
Longtime User
Ja das ist mir schon klar, aber ich kann in diesem Event nichts erkennen was mir dann die Liste auf den Bildschirm bringt. Also keine Msgbox oder View.

Oder ist das schon in der Lib mit drinn?

Liebe Grüße

Fabs222
 

Kiffi

Well-Known Member
Licensed User
Longtime User
Ja das ist mir schon klar, aber ich kann in diesem Event nichts erkennen was mir dann die Liste auf den Bildschirm bringt.
dann schau Dir bitte mal an, was Log() macht. Du kannst auch (wie schon
öfters empfohlen) den Debugger verwenden, um zu sehen, was da passiert.

Grüße ... Kiffi
 

fabs222

Member
Licensed User
Longtime User
Mit dem Debugger habe ich mir das schon versucht anzuschauen. Da aber beim EMU der FTP Server (wahrscheinlich weil Client und FTP Server (läuft auf dem gleichen PC) dann die gleiche IP haben) einen Fehler meldet und die Verbindung dann trennte komme ich garnicht erst bis zum Log.

Aber wenn ich Dich jetzt richtig verstanden habe, sollte sobald FTP.List ausgeführt wurde und der Server die Liste geliefert hat das FTP_ListCompleted Event ausgelöst werden und das Log darin sich dann auch auf dem Tablet öffnen?


Liebe Grüße
Fabs222
 

Kiffi

Well-Known Member
Licensed User
Longtime User
Aber wenn ich Dich jetzt richtig verstanden habe, sollte sobald FTP.List ausgeführt wurde und der Server die Liste geliefert hat das FTP_ListCompleted Event ausgelöst werden und das Log darin sich dann auch auf dem Tablet öffnen?
das Log öffnet sich nicht auf Deinem Tablet, sondern gibt seine Ausgaben in der
IDE (Tab Log -> Connect) aus.

Grüße ... Kiffi
 

fabs222

Member
Licensed User
Longtime User
Da das Emu mit FTP Probleme macht habe ich es jetzt über die Bridge und siehe da dann geht auch der Debugger.
Also hier der Code nochmals

B4X:
Sub Process_Globals
   Dim FTP As FTP
   

End Sub

Sub Globals
   
   
End Sub

Sub Activity_Create(FirstTime As Boolean)
   If FirstTime Then
   FTP.Initialize("FTP", "192.168.1.110", 21, "1", "1")
   End If
   FTP.List("/")
End Sub


Sub FTP_ListCompleted (ServerPath As String, Success As Boolean, Folders() As FTPEntry, Files() As FTPEntry)
   Log(ServerPath)
   If Success = False Then
   Log(LastException)
   Else
   For i = 0 To Folders.Length - 1
   Log(Folders(i).Name)
   Next
   For i = 0 To Files.Length - 1 
   Log(Files(i).Name & ", " & Files(i).Size & ", " & DateTime.Date(Files(i).Timestamp)) 
   Next 
   End If
End Sub

Ich bekomme im Tab Log jetzt auch die Auflistung meiner Datein.
Was ich nun nur noch hinbekommen muss ist, dass diese Datein alle automatisch auf Tablet übertragen werden. Kann ich das ähnlich wie im Code oben (mit den Bildern) machen oder gibt es hier Besonderheiten?

Liebe Grüße

Fabs222
 

Kiffi

Well-Known Member
Licensed User
Longtime User
Was ich nun nur noch hinbekommen muss ist, dass diese Datein alle automatisch auf Tablet übertragen werden.
korrekt. Hier ist FTP.DownloadFile() Dein Freund :)

Also dort, wo Du momentan Files(i).Name ausgeben lässt,
obigen Befehl einsetzen.

Grüße ... Kiffi
 

fabs222

Member
Licensed User
Longtime User
Kiffi, auch auf die Gefahr hin das du schimpfst, ich schnalle das nicht.

Ich habe es jetzt so
B4X:
Sub FTP_ListCompleted (ServerPath As String, Success As Boolean, Folders() As FTPEntry, Files() As FTPEntry)
Log(ServerPath)
If Success = False Then
Log(LastException)
Else
For i = 0 To Folders.Length - 1
Log(Folders(i).Name)
Next
For i = 0 To Files.Length - 1
Log(Files(i).Name & ", " & Files(i).Size & ", " & DateTime.Date(Files(i).Timestamp))
FTP.DownloadFile("Files(i).Name", False, File.DirRootExternal, ".")
Next  
End If
End Sub
es wird kein Fehler angezeigt, aber gehen tut es so auch nicht.:sign0148:

Ich verstehe es nicht, im Debugger wird auch nichts angezeigt.

Liebe Grüße

Fabs222
 

Kiffi

Well-Known Member
Licensed User
Longtime User
B4X:
FTP.DownloadFile("Files(i).Name", False, File.DirRootExternal, ".")

B4X:
FTP.DownloadFile(Files(i).Name, False, File.DirRootExternal, Files(i).Name)
sollte funktionieren

Grüße ... Kiffi
 

fabs222

Member
Licensed User
Longtime User
DANKE, jetzt geht es :sign0098::sign0098::sign0098::sign0098:


Liebe Grüße

Fabs222
 

Kiffi

Well-Known Member
Licensed User
Longtime User
Gern! Als nächstes könntest Du Deinen Code so erweitern, dass nur die Bilder
heruntergeladen werden, die sich noch nicht auf Deinem Device befinden. Damit
ersparst Du Dir das ständige Laden von bereits vorhandenen Dateien und der
Programmstart läuft nebenbei auch schneller ab.

Grüße ... Kiffi
 

fabs222

Member
Licensed User
Longtime User
Hallo Kiffi,

wie das geht würde ich gerne aus Interesse wissen brauche ich bei diesem Projekt aber nicht.

Was ich hier noch brauche ist, dass der Code regelmäßig auf den FTP Server "schaut" und das Device damit synchronisiert. Soll bedeuten, neue Datein auf das Device herrunterladen und nicht mehr vorhandene Datein auf dem FTP Server dann auch auf dem Device löscht.


Aber dafür habe ich noch überhaubt keinen Ansatz.

Liebe Grüße

Fabs222
 

Kiffi

Well-Known Member
Licensed User
Longtime User
wie das geht würde ich gerne aus Interesse wissen brauche ich bei diesem Projekt aber nicht.

Was ich hier noch brauche ist, [...]
da widersprichst Du Dir grade aber gewaltig. Mein letzter Vorschlag ist Teil
Deiner neuen Anforderung. Lies es Dir noch einmal durch.

Zu Deinem Problem:

Initial (bei Programmstart) machst Du Deinen FTP-Download wie bisher.
Dann startest Du einen Timer, der regelmäßig den FTP-Download anstößt.

Du verfügst über Informationen, welche Dateien sich auf Deinem Device
befinden und welche Dateien auf dem FTP-Server liegen. Diese beiden Listen
musst Du nur miteinander vergleichen. Codes hierzu hast Du bereits sowohl in
diesem Thread als auch in Deinem MP3-Thread. Du musst sie nur noch sinnvoll
miteinander kombinieren.

Grüße ... Kiffi
 

fabs222

Member
Licensed User
Longtime User
Hallo Kiffi,

da wirst Du mit Sicherheit recht haben, aber ich weiß nicht wie ich dabei anfangen soll.

Ich muss wahrscheinlich List1 mit der FTP.List vergleichen
dann die Datein die auf dem Device sind aber nicht mehr auf dem FTP Server liegen auf dem Device löschen und dann die Datein die auf dem FTP Server liegen aber nicht im Device vorhanden sind downloaden.

Mir fehlen aber die Befehle für den Code, das fängt schon dabei an die Listen zu vergleichen.


Liebe Grüße
Fabs222
 

Kiffi

Well-Known Member
Licensed User
Longtime User
da wirst Du mit Sicherheit recht haben, aber ich weiß nicht wie ich dabei anfangen soll.
dann musst Du halt mal ein wenig ausprobieren. Es gibt Leute, die tüfteln
tagelang an einem Problem, bis sie die Lösung finden und sie geben nicht nach
wenigen Stunden auf. Der Vorteil, der dadurch entsteht: Sie lernen die
Programmiersprache und das System, das sie programmieren sehr gut kennen.
Dieser Effekt tritt nicht ein, wenn wir Dir immer wieder den Code vorkauen. Beiss
Dich da mal selber durch. Wie gesagt: Alle wichtigen Befehle hast Du bereits.

Grüße ... Kiffi
 
Top