German Kopieren mit SMB-Lib incl Unterverzeichnissen

Knoppi

Active Member
Licensed User
Longtime User
Hallo zusammen,

ich möchte die Daten der SD-Karte meines Handy incl aller Unterverzeichnisse mit Hilfe der SMB-Lib auf meinen Home-Server kopieren .

Den Inhalt eines Ordner in einen vorhandener Server-Ordner zu kopieren ist kein Problem.
Auch das Erstellen eines neuen Server-Ordners ist kein Problem.

Doch ich scheitere daran beides zusammen in einem Service-Modul zum laufen zu bekommen.

Wie muß ich die Ereignisse MakeDirCompleted und UploadCompleted mit einander verknüpfen damit das richtig funktioniert.

Ein kleines Code-Beispiel wäre hier sehr hilfreich.

viele Grüße

Knoppi
 

Knoppi

Active Member
Licensed User
Longtime User
Hallo nochmal,

leider ist das Thema immer noch Aktuell.

Ich kann mir nicht vorstellen das das noch keiner gemacht / gelöst hat.

Im Prinzip gibt es die gleiche Problematik doch auch bei der FTP-Lib, oder nicht?
Ich benötige dringend ein Code-Beispiel mit dem ein komplettes Verzeichnis kopiert wird. (incl Unterverzeichnisse und Dateien)

viele Grüße
Knoppi
 

DonManfred

Expert
Licensed User
Longtime User
Im grunde ist die Problematik die gleiche, ja. Aber ich wüsste nicht wozu man das braucht. Wenn ich die Daten am PC komplett rüber kopiere ist das doch vermutlich schneller.

Im Grunde musst Du dir doch nur eine Rekursive Suchfunktion (ordnerinhalt auflisten) schreiben. Ob es schon was passendes gibt weiss ich nicht. Ich habe die suchfunktion aber auch noch nicht bemüht in diese Richtung ;)

Stellt sich eher die Frage ob es nicht sinnvoller ist den Ordnerbaum in ein Archiv zu packen und dann nur diese eine Archiv zu übertragen als jede Datei einzeln.

Edit: Suchfunktion genutzt und DAS gefunden. Sieht doch irgendwie passend aus!?
 

Knoppi

Active Member
Licensed User
Longtime User
@DonManfred
Ja meine Such-Funktion sieht ähnlich aus und ich habe beim Zusammenstellen der Daten auch keine Probleme,
AAAAABER auf der Server-Seite als Ziel sieht das anders aus.

Ich bekomme es einfach nicht hin die Daten Recursiv vom Mobile auf den Server zu kopieren.
Ein einzelnes Verzeichnis incl Dateien ist kein Problem, aber sobald ich mehrere Verzeichnisse Kopieren will kollidieren die Ereignisse MakeDirCompleted und UploadCompleted da die Ereignisse zu unterschiedlichen Zeiten auftreten.

Ich bin für jeden Vorschlag Dankbar der mich hier ein Stück weiter bringt.

viele Grüße
Knoppi
 

DonManfred

Expert
Licensed User
Longtime User
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.

B4X:
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
B4X:
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 :D

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 :D)

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 ;)
 
Last edited:

Knoppi

Active Member
Licensed User
Longtime User
@DonManfred

Danke für deine Antwort
leider hiflt mir ein Download Beispiel nicht weiter.

Ich werde mal ein vereinfachtes Beispiel erstellen das ich hier Uploaden kann.

viele Grüße
Knoppi
 
Top