German SFTP - Probleme...

Gumnam

Member
Licensed User
Hallo liebe Helfer :),

beim Benutzten der SFTP-library komme ich nicht weiter...
Ich wollte von meiner Homepage ein File via SFTP downloaden, auslesen und dann wieder vom Handy löschen.
Dummerweise läuft das nicht so, wie ich es mir vorstelle.
Ich dachte, dass nach "SFTP.DownloadFile(" der Download startet - scheint aber nicht so zu sein.
In dem Beispiel muss die Sub "Activity_Create(" erst vollständig durchlaufen sein, bis der Download überhaupt startet...

Eine Schleife mit "DoEvents" hilft auch nicht...

B4X:
Sub Process_Globals
End Sub

Sub Globals
   Dim SFTP1 As SFtp
   Dim RAFile As RandomAccessFile
End Sub

Sub Activity_Create(FirstTime As Boolean)
   Dim Inhalt As String
   If FirstTime Then
     SFTP1.Initialize("SFTP1","Username","Password","SFTPserver",22)
     Log("SFTP initialized.")
   End If
   GetIPFile
   Inhalt = ReadFile
   DeleteFile
End Sub

Sub SFTP1_PromptYesNo (Message As String)
  SFTP1.SetPromptResult(True)
    Log("Fingerprint question passed.")
End Sub

Sub GetIPFile
   SFTP1.DownloadFile("Downloadpath",File.DirRootExternal,"Test.txt")
   Log("Download requested.")
End Sub

Sub ReadFile As String
Dim a As String
Dim i As Long
   RAFile.Initialize(File.DirRootExternal,"Test.txt",True)
   a="":i=0
   Do While i<>RAFile.Size
     a = a & Chr(RAFile.ReadUnsignedByte(i))
     i=i+1
   Loop
   Log(i & " Bytes read.")
   RAFile.Close
   Return a
End Sub

Sub DeleteFile
   File.Delete(File.DirRootExternal,"Test.txt")
   Log("internal file deleted.")
End Sub

Sub SFTP1_DownloadProgress (ServerPath As String, TotalDownloaded As Long, Total As Long)
  Dim s As String
  s = "Downloaded " & Round(TotalDownloaded / 1000) & "KB"
  If Total > 0 Then s = s & " out of " & Round(Total / 1000) & "KB"
  Log(s)
End Sub

Sub SFTP1_DownloadCompleted (ServerPath As String, Success As Boolean)
   Log(ServerPath & ", Success=" & Success)
   If Success = False Then
     Log(LastException.Message)
   End If
End Sub
 

Attachments

  • SFTP-Demo.zip
    6.3 KB · Views: 100

DonManfred

Expert
Licensed User
Ich dachte, dass nach "SFTP.DownloadFile(" der Download startet - scheint aber nicht so zu sein.
Nicht nur scheint: IST NICHT SO! Wie auch beim normalen FTP sind die Funktionen für Up- und download usw Asynchron. Sie werden also erst am Ende der sub wirklich ausgeführt.
Möchte man nun mehrere Schritte vornehmen dann muss man seine Programmlogik überdenken bzw anders Strukturieren.
Bei Dir z.B. das hier
B4X:
GetIPFile
Inhalt = ReadFile
DeleteFile

Du musst diese Logik aufsplitten.
GetIPfile aufrufen. Alle weiteren Schritte verlagern. Sprich: Im Download Complete Event dieses Downloads kannst Du weiter machen...
Nun kannst Du
B4X:
Inhalt = ReadFile
DeleteFile
ausführen. Merke; du befindest dich hier immer noch in der Eventsub SFTP1_DownloadCompleted

Ich habe keinen FTP der über SSL erreichbar ist sonst hätte ich ein kleines Beispiel gemacht.

Aber das Prinzip würde auch bei FTP anwendung finden.

Etwas ähnliches habe ich hier mal veröffentlicht. In dem Beispiel war es eine Art Download-Queue. Also file 2 wird erst runtergeladen, wenn file 1 fertig runtergeladen wurde. file 3 wenn file 2 fertig usw...
Das Grundprinzip ist das gleiche wie bei mehreren httputils-Jobs.
 
Last edited:

Gumnam

Member
Licensed User
Hallo Manfred,
Du musst diese Logik aufsplitten.
GetIPfile aufrufen. Alle weiteren Schritte verlagern. Sprich: Im Download Complete Event dieses Downloads kannst Du weiter machen...
Nun kannst Du
Code:
Inhalt = ReadFile
DeleteFile
ausführen. Merke; du befindest dich hier immer noch in der Eventsub SFTP1_DownloadCompleted

ja - das hatte ich auch schon ausprobiert. Natürlich klappt es, wenn ich das Hauptprogramm dann in der "SFTP1_DownloadCompleted" fortführe.
Das Ganze wird aber dann sehr unübersichtlich...
Stell Dir vor, man macht verschiedene Downloads und muss dann immer in Abhängigkeit des Inhaltes von "ServerPath" sein gesamtes Programm dort fortführen.

Gibt es nicht eine Möglichkeit, dem System die Zeit zu geben, den Download abzuschließen?
So alá
B4X:
bolFertigFlag=False
GetIPFile
Do While bolFertigFlag=False
  DoEvents
Loop
und dann in der "SFTP1_DownloadCompleted" ein
B4X:
bolFertigFlag=True
bei Erfolg?

Ungern möchte den restlichen Code in der EventSub "SFTP1_DownloadCompleted" fortführen.
Das würde nämlich recht kompliziert, wenn man direkt danach noch ein File downloaden will, der Code aber gerade in der EventSub ausgeführt wird...
 
Last edited:

DonManfred

Expert
Licensed User
Das würde nämlich recht kompliziert, wenn man direkt danach noch ein File downloaden will, der Code aber gerade in der EventSub ausgeführt wird...
wieso? Du würdest in der sub ja nur den download starten. auch dieser ist wieder asynchron und ended in einem neuen Aufruf von downloadcomplete (und zu diesem Zeitpunkt hast Du die sub ja längst wieder verlassen)

Ich gebe Dir Recht das man genau drauf achten muss was wo wie gemacht wird. Aber so arbeitet Android nunmal.
 

Gumnam

Member
Licensed User
Hallo Manfred,

wieso? Du würdest in der sub ja nur den download starten. auch dieser ist wieder asynchron und ended in einem neuen Aufruf von downloadcomplete (und zu diesem Zeitpunkt hast Du die sub ja längst wieder verlassen)

Das habe ich nicht ganz verstanden.

Beispiel:
Ich möchte ein Bild vom SFTP-Server downloaden. Und zwar "/Bilder/Bild1.jpg" wenn "/Info/Datei.nfo" als 5.Byte ein "1" als Zeichen hat. Und "/Bilder/Bild2.jpg" wenn "/Info/Datei.nfo" als 5.Byte ein "2" als Zeichen hat.

Ich habe keine Idee, wie man so was realisiert.

Den Download von "/Info/Datei.nfo" kann ich ja ganz normal mit
SFTP1.DownloadFile("/Info/Datei.nfo",File.DirRootExternal,"Test.txt")
Initiieren.
Auswerten der Datei "Text.txt" (5.Byte=??) in der Sub "SFTP1_DownloadCompleted" ist auch kein Problem.

Aber wie kann ich nun das Bild downloaden?

nochmal
SFTP1.DownloadFile("/Bild/Bild1.jpg",File.DirRootExternal,"Pic.jpg")
ginge wohl noch - aber den fertigen 2. Download bekomme ich ja nicht mit, wenn ich in der "SFTP1_DownloadCompleted" darauf warte...

Wenn ich nun anfange, am Beginn der "SFTP1_DownloadCompleted" eine Abfrage zu machen, in der ich den "ServerPath" auswerte, damit ich bei "/Bild/Bild1.jpg" anders weitermache, als bei "/Info/Datei.nfo"...

Da heben sich all meine Nackenhaare...

(klingt wie eine GoTo-Konstruktion)
 
Top