Entwickler-Ecke

Dateizugriff - FTP-Server Dateien mit Lokalen Dateien synchronisieren


Sahroma - Mi 16.03.16 16:13
Titel: FTP-Server Dateien mit Lokalen Dateien synchronisieren
Hallo zusammen,

ich habe einen FTP Uploader geschrieben der bestimmte Dateien die in einem Ordner sind auf einen FTP Server lädt. Funktioniert auch alles ohne Probleme, nur mein Problem nun ist die Lokalen Dateien anhand des Änderungsdatum mit denen auf dem FTP Server vergleichen und nur die wo aktualisiert worden sind uploaden. Wie bekomme ich das am besten hin? Mir fällt nichts ein wie ich das am besten lösen kann. Hier mal mein Code (kleine Anmerkung: das Programm prüft ob es die Datei bereits auf dem Server gibt, wenn ja lädt er sie nicht nochmal hoch.)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
procedure TFTP_Uploader.FTPUpload(const FTPDir, LocaleDir: string; Button: TBitBtn);
var
  ZeileNr, I, IndexOfsrcList: Integer;
  FTPList: TStringList;
begin
  srcList := TStringList.Create;
  FTPList := TStringList.Create;
  try
    try
      idFTP1.Host     := Host;
      idFTP1.Username := Username;
      idFTP1.Password := Password;
      idFTP1.Connect;
      idFTP1.ChangeDir(FTPDir);
      idFTP1.List(FTPList, '', false);
      FindFiles(LocaleDir, '*', lbSource.Items, False);
      srcList.Assign(lbSource.Items);

      try
        // Dateilisten vergleichen
        for I := 0 to Pred(FTPList.Count) do
        begin
          IndexOfsrcList := srcList.IndexOf(FTPList[I]);
          if IndexOfsrcList <> -1 then
            srcList.Delete(IndexOfsrcList);
        end;
      except
        on E: Exception do Application.MessageBox(PChar(E.Message), 'Dateifehler', MB_OK);
      end;

      for ZeileNr := 0 to srcList.Count - 1 do
        idFTP1.Put(LocaleDir + '\' + srcList[ZeileNr]);

      idFTP1.Disconnect;

      Button.Font.Color := clgreen;
    except
      on E: Exception do Application.MessageBox(PChar(E.Message), 'Verbindungsfehler!', MB_OK);
    end;
  finally
    srcList.Free;
    FTPList.Free;
  end;
end;


Hat jemand eine Idee wie ich das am besten hinbekomme?

Danke schonmal für eure Hilfe
Sahroma


baumina - Mi 16.03.16 16:30

Du kannst im ModifiedDate [http://www.indyproject.org/docsite/html/frames.html?frmname=topic&frmfile=index.html] nachschauen.

Beispiel: TIdFTP.DirectoryListing[Index].ModifiedDate


Sahroma - Mi 16.03.16 17:02

DANKE baumina!

Top :flehan:

Genau nach so etwas habe ich gesucht (habe ich wohl beim durchgehen der Indy-Hilfe übersehen :oops: )


Gerd Kayser - Mi 16.03.16 17:21

user profile iconbaumina hat folgendes geschrieben Zum zitierten Posting springen:
Du kannst im ModifiedDate nachschauen.

Wenn eine Datei geändert wird, dann wird von Windows das Archiv-Flag bei den Dateiattributen gesetzt. Man muss also nur die Dateien mit gesetztem Archiv-Flag uploaden. Danach bei den Dateien das Attribut wieder löschen.


baumina - Mi 16.03.16 17:25

user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconbaumina hat folgendes geschrieben Zum zitierten Posting springen:
Du kannst im ModifiedDate nachschauen.

Wenn eine Datei geändert wird, dann wird von Windows das Archiv-Flag bei den Dateiattributen gesetzt. Man muss also nur die Dateien mit gesetztem Archiv-Flag uploaden. Danach bei den Dateien das Attribut wieder löschen.


Nur garantiert dir das nicht, dass die Datei in dieser Version auf genau diesem FTP-Server liegt, es könnte sich ja auch um verschiedene FTP-Server handeln.


Sahroma - Do 24.03.16 12:49

Habe jetzt ein kleines Problem. Er gibt mir nun als Datum (Variable "Date") den 18.12.1899 an. :shock:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
for M := 0 to IdFTP1.DirectoryListing.Count - 1 do
      begin
        Date := IdFTP1.DirectoryListing[M].ModifiedDate;
        if Date < now then
          begin
            lbSource.Items.Add(idFTP1.DirectoryListing[M].FileName);
            for ZeileNr := 0 to srcList.Count - 1 do
            idFTP1.Put(LocaleDir + '\' + srcList[ZeileNr]);
          end;
      end;


Was stimmt da nicht? Ich komme nicht dahinter


jaenicke - Do 24.03.16 13:37

Dann ist das Datum, das der FTP Server zurückgeliefert hat, Null. Denn die Zahl Null entspricht genau diesem Datum.
Gab es da nicht zwei Möglichkeiten das Listing abzurufen? Vielleicht fehlen dort die Details.

Werden diese Informationen denn in einen FTP Client wie FileZilla angezeigt?


Sahroma - Do 24.03.16 14:38

Also bei FileZilla wird das Datum korrekt angezeigt. Das mit den Möglichkeiten mit Listing muss ich mal noch genauer schauen. Habe bisher nichts gefunden! :gruebel:


Gerd Kayser - Do 24.03.16 20:15

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Denn die Zahl Null entspricht genau diesem Datum.

0 entspricht dem 30.12.1899. Der 18.12.1899 somit -12. Vielleicht liegt das Problem an einem fehlenden oder falschen Parser.


jaenicke - Do 24.03.16 21:31

Ah, ich erinnere mich, man muss den Parser angeben... Mehr dazu steht vielleicht hier:
http://www.delphipraxis.net/55331-idftp-directorylisting.html
Ich bin unterwegs, kann auf dem Handy jetzt nicht genauer schauen...


Sahroma - Di 19.04.16 11:10

Habe jetzt IdAllFTPListParsers unter Use eingefügt aber als Ergebnis bekomme ich immer noch 30.12.1899. Ich komme nicht dahinter. :gruebel: