FTP-Sync wie Dropbox

  • Hallo Zusammen,
    ich möchte mir ein kleines Autoit-Tool programmieren, das einen Ordner per FTP syncronisiert. (Alle 10 Sekunden oder so)
    Es soll alle Dateien die im "Sync-Ordner" auf meinem PC sind, in den "Sync-Ordner" auf dem FTP-Server kopieren, und umgekehrt. Wenn ich einen neuen Ordner erstelle, soll dieser natürlich auch angelegt werden auf dem FTP-Server. Genauso wie bei Dropbox, nur eben mit meinem eigenen FTP Server, da dieser viel schneller ist, weil er im lokalen Netzwerk ist.
    Wenn eine Datei auf dem PC und auf dem Server existiert, soll geprüft werden, ob die Dateien gleich "alt" sind. Wenn eine Datei bearbeitet wurde, soll die ältere Datei durch die neuere Datei ersetzt werden.
    Ich hab es jetzt schon mehrmals getestet mit _FTP_DirPutContents oder mit Arrays, aber es will einfach nicht so richtig funktionieren.
    Könnt ihr mir helfen?
    Viele Grüße
    Erictrials

  • und was sollen wir dir jetzt sagen?
    sollen wir dir dein skript erstellen, oder hast du ein konkretes problem, bei dem du hilfestellung brauchst?

  • am besten den anfang vom skript erstellen.
    ich hatte das so versucht:

    [autoit]


    While 1
    $local_dir_files = _FileListToArray($root_local,"*",1)
    If IsArray($local_dir_files) Then
    _ArrayDisplay($local_dir_files)

    EndIf

    $open = _FTP_Open("")
    $conn = _FTP_Connect($open,$server,$user,$pass)
    _FTP_DirSetCurrent($conn,"/")
    $server_dir_files = ""
    $server_dir_files = _Ftp_ListToArray($conn,2)

    _FTP_Close($open)
    If IsArray($server_dir_files) Then
    _ArrayDisplay($server_dir_files)
    EndIf
    If IsArray($local_dir_files) Then ; Überprüfen, ob lokale Dateien auf dem Server vorhanden sind
    $search = _ArraySearch($server_dir_files,$local_dir_files[1],1,$server_dir_files[0],1)
    If @error Then
    MsgBox(64,"","Die Datei " & $local_dir_files[1] & " wurde nicht gefunden.")
    Else
    MsgBox(64,"","Die Datei " & $local_dir_files[1] & " wurde auf dem Server gefunden.")
    EndIf
    EndIf
    sleep(5000)
    WEnd

    [/autoit]

    das hat auch soweit funktioniert, das problem ist, das die dateiliste vom ftp-server (_FTP_ListToArray) anscheind nicht neu geladen wird. Wenn ich 2 dateien ("Test1.jpg" und "Test2.jpg") auf dem FTP-Server liegen habe, und mein script starte, listet er die zwei dateien auf, wenn ich dann "Test1.jpg" auf dem Server lösche, zeigt mein script immer wieder beide dateien an ("Test1.jpg" und "Test2.jpg") - genauso wenn ich "Test3.jpg" auf den ftp server hochlade - er zeigt immer wieder nur "Test1.jpg" und "Test2.jpg" an. Wenn ich das Script neu starte, stimmt die dateiliste wieder.

    Entweder ich könnte dieses Problem lösen, oder ich müsste irgendwie anders an die Sache ran gehen. Hättet ihr vielleicht eine Idee?

  • Hallo Chip,
    vielen Dank für deinen Vorschlag.
    Ich wollte mir dafür aber eigentlich selbst ein kleines Tool programmieren, das (wie Dropbox) im Hintergrund läuft und automatisch die Dateien abgleicht. Dann könnte ich auch einbauen, dass er mir immer Traytips (wie Dropbox) anzeigt "Datei 'Test3.jpg' wurde aktualisiert".
    Was ich aber immer noch nicht verstehe, ist dass er die Ordnerliste nicht aktualisiert wenn ich sie neu anfordere. Sogar wenn ich die Verbindung neu aufbaue.
    Erictrials

  • Hallo Erictrials,

    du kannst nur mit einer AutoItlösung kein performantes Tool zusammen bekommen das lokal und Remote immer synchron hält. Um Änderungen an einer Datei auf dem FTP mit zu bekommen, müsstest du jede Datei unter einem temporären Namen downloaden, danach einen Hash bilden und mit dem Hash der entsprechenden Datei vergleichen.

    Zu deiner Frage warum sich die Dateiliste nicht ändert: Daran ist das Cache schuld. Benutze den Parametr $l_Flags von _Ftp_ListToArray.

    FTP_FilelistRekursiv (Link in Sugnatur) sollte dir bei deinem Vorhabennützlich sein,

    mfg autoBert


  • Ich wollte mir dafür aber eigentlich selbst ein kleines Tool programmieren, das (wie Dropbox) im Hintergrund läuft und automatisch die Dateien abgleicht. Dann könnte ich auch einbauen, dass er mir immer Traytips (wie Dropbox) anzeigt "Datei 'Test3.jpg' wurde aktualisiert".

    Genau das selbe wollte ich auch mal schreiben, aber wie autoBert schon gesagt hat ist es mit Autoit nicht performant machbar.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.


  • Zu deiner Frage warum sich die Dateiliste nicht ändert: Daran ist das Cache schuld. Benutze den Parametr $l_Flags von _Ftp_ListToArray.

    Danke für den Tipp. Aber wie muss ich den Parameter $l_Flags verwenden?
    Ich hab' vorhin den Parameter $i_Passive bei _FTP_Connect auf 0 gestellt, den hatte ich vorher auf 1 stehen. Komischerweise wird jetzt die Dateiliste jedesmal aktualisiert.

    Um Änderungen an einer Datei auf dem FTP mit zu bekommen, müsstest du jede Datei unter einem temporären Namen downloaden, danach einen Hash bilden und mit dem Hash der entsprechenden Datei vergleichen.


    Kann man das nicht einfach mit der Zeit, wann die Datei erstellt wurde machen? Und wenn nicht -> Ich hab meinen FTP-Server auf einem Windows-Rechner laufen, also könnte ich dort auch ein AutoIt-Programm laufen lassen. Dann könnte ich mir ja ein kleines "Server-Tool" machen, welches einen Hash bildet und den in einer Datei "auf dem FTP-Server" speichert. Dann könnte mein Client-Tool diese Datei herunterladen und die Dateien vergleichen. Würde das gehen? Und wenn ja, wie? (Ich kann mich mit Hash bilden nicht aus)
    Oder hättet ihr eine bessere Idee?
    Eigentlich müsste das ja dann auch komplett ohne FTP-Server gehen (irgendwie mit TCPSend oder so vlt?) Allerdings kenne ich mich damit kaum aus.
    Was würdet ihr sagen, wie ich das angehen soll?

    Erictrials