Autor Beitrag
Sahroma
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 66
Erhaltene Danke: 1


Delphi 10 Seattle, Delphi 10.1 Berlin
BeitragVerfasst: Mi 16.03.16 16:13 
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.)

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 305
Erhaltene Danke: 61

Win 7
Delphi 10.2 Tokyo Enterprise
BeitragVerfasst: Mi 16.03.16 16:30 
Du kannst im ModifiedDate nachschauen.

Beispiel: TIdFTP.DirectoryListing[Index].ModifiedDate

Für diesen Beitrag haben gedankt: Sahroma
Sahroma Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 66
Erhaltene Danke: 1


Delphi 10 Seattle, Delphi 10.1 Berlin
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 305
Erhaltene Danke: 61

Win 7
Delphi 10.2 Tokyo Enterprise
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 66
Erhaltene Danke: 1


Delphi 10 Seattle, Delphi 10.1 Berlin
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 66
Erhaltene Danke: 1


Delphi 10 Seattle, Delphi 10.1 Berlin
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 24.03.16 21:31 
Ah, ich erinnere mich, man muss den Parser angeben... Mehr dazu steht vielleicht hier:
www.delphipraxis.net...irectorylisting.html
Ich bin unterwegs, kann auf dem Handy jetzt nicht genauer schauen...
Sahroma Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 66
Erhaltene Danke: 1


Delphi 10 Seattle, Delphi 10.1 Berlin
BeitragVerfasst: 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: