Vorgehensweise müsste eigentlich wie folgt sein.
Ich nehme an, du bekommst es rekursiv hin, alle Dateien und Ordner zu ermitteln, oder?
Zwei globale Listen. Einmal für Ordner und eine für Dateien.
Sub Process_Globals
Dim ftpfolders, ftpfiles As List
End Sub
Sub Activity_Create(FirstTime As Boolean)
'Do not forget to load the layout file created with the visual designer. For example:
ftpfolders.Initialize
ftpfiles.Initialize
End Sub
Mit root beginnend liest Du den ersten Quellordner ein
file.ListFiles(File.DirRootExternal)
Du iterierst Durch diese Liste und packst alle Dateien (jeweils kompletter Pfad) in die Liste ftpfiles. Ordner packst du in ftpfolders.
So füllen sich also x ordner und y Dateien in die Listen ein. Und mit jedem verzeichnis was Du einlest wird die Liste (bzw die Listen) noch grösser...
In der Reihenfolge, wie die Ordner in die Liste gepackt werden, gehst du dann auch hin und legst die Ordnerstruktur am ZIEL an...
/
/b4a
/b4a/projects/
/b4a/projects/1
/b4a/projects/2
/b4a/projects/3
/b4a/projects/4
/downloads
/dcim
/uploads
/downloads/old
Ein Ordner den Du am Ziel angelegt hast (bzw überprüft hast ob der existiert oder nicht. Wenn nicht, dann anlegen) löschst du aus Liste 1
Irgendwann ist deine Liste 1 dann leer. Eben weil du alle bisher ausgelesenen Ordner angelegt hast.
Liste 2 beinhaltet inzw alle Dateien aus der ganzen Baumstruktur. Wenn die ausleseroutine noch läuft dann vielleicht noch nicht aber irgendwann ist der Punkt erreicht. Der Punkt ist, daß der Zielpfad ja inzw schon vorhanden sein muss bzw IST...
Nun gehst du hin und lädst eine Datei nach der anderen hoch. Zielpfad hast du ja zu jeder Datei dir in Liste 2 angelegt. Die Zielordner müssten ja nun vorhanden sein weil du ja im Schritt vorher die Ordner alle angelegt hast.
Ratter, ratter, ratter... Irgendwann ist auch Liste 2 komplett hochgeladen.
Fääääärrrrrrttiiggg
Ich denke mir, das
http://www.b4x.com/android/forum/threads/ftp-example-using-a-download-queue.39141/
dir dabei helfen kann. Hier ist es eine "Downloadqueue"... In deinem Beispiel musst du umdenken und eben eine "Uploadqueue" erstellen und abarbeiten. aber das Prinzip ist das gleiche. Wir gehen hier nun noch einen Schritt weiter und teilen das in zwei Listen auf. Das ermöglicht es uns aber so eine Art Priorisierung einzuführen.
Du kannst auf der einen Seite dein Quellverzeichniss lesen und ftpfolders mit allen Ordnern füllen und ftpfiles mit allen Dateien.
Wenn ein download fertig ist guckst Du nach ob in der Liste ftpfolders noch Einträge vorhanden sind und startest dann den nächsten create-dir-job.
Ist in Liste ftpfolders noch ein Eintrag ist der zuerst auszuführen (eben den Ordner anzulegen).
Wenn da kein Eintrag ist aber in ftpfiles sind noch Einträge dann startest Du einen Download.
Wenn der download (oder ordner anlegen-event) dann fertig ist geht die Prüfung wieder von vorne los. Anzulegende Ordner (ftpfolders > 0) haben vorrang.
Anm: Deine verzeichnisausleseroutine hat ja in der zwischenzeit weitere ordner und/oder dateien in die beiden Listen gepackt
Ich müsste, wenn ich wirklich helfen will, mir erstmal was bauen um alle Dateien und Ordner rekursiv zu ermitteln. Sowas hab ich leider grad nicht parat in b4a. Wenn Du diese Routine schon hast dann poste die doch mal...
Ich denke, daß das dann recht einfach mit der hier beschriebenen Vorgehensweise erweitert werden kann ohne sich zu verheddern. Was denkst Du?
Das wäre vermutlich die Vorgehensweise wie ICH vorgehen würde würde ich vor dem Problem stehen
Ob ich Dir mit dem Mist den ich hier verzapft habe nun habe helfen können musst DU nun beurteilen
(ich bin auch nicht mehr so ganz nüchtern
)
PS: Im nachhinein fällt mir auf das ich die ganze Zeit von FTP rede (weil ich mein ftp-downloadqueue-beispiel herangezogen habe) aber es ja eigentlich um SMB geht. Musst Du halt mit SMB umsetzen und nicht mit ftp. Aber vom Prinzip her passt das alles.
Auch die Vorgehensweise wenn ein job fertig ist kannst du Dir gut abgucken. Dieses PS war nun überigens die gefühlte 37. editierung dieses Beitrages der immer länger und länger wurde. Sorry dafür