Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Änderungsdatum prüfen (https://www.delphipraxis.net/158631-aenderungsdatum-pruefen.html)

Metallicwar 24. Feb 2011 13:37

Änderungsdatum prüfen
 
Hallo zusammen,
folgendes:
Auf einem FTP Server werden nach 3-4 Monaten eine Aktualisierung einer bestimmten Datei hochgeladen.
Die erste Datei liegt bereits lokal auf meinem Rechner.
Ich möchte nun prüfen, ob die Datei des Servers aktueller ist als die auf dem lokalem Rechner, z.B. über das Änderungsdatum. Ist die Datei aktueller, soll sie heruntergeladen werden, entpackt und der Inhalt in eine Datenbank eingespielt werden. Lässt sich das Änderungsdatum auch direkt auf dem FTP Server prüfen?? Oder hättet ihr eine ganz andere Lösungsmöglichkeit für mich?
So würde ich es lösen:
Delphi-Quellcode:
procedure TfrmdatenDownload.Button1Click(Sender: TObject);
var
   DOSDatum : integer;
    WinDatum : TDateTime;
    Dateiname : string;
begin
  TRY
    TRY
      ftpDateiDownload.Username := 'admin';
      ftpDateiDownload.Password := 'passwort';
      ftpDateiDownload.Host := 'FTP SERVER';
      ftpDateiDownload.Connect;
      Application.ProcessMessages;
      if SaveDlgBankdatendownload.Execute then
        begin
          ftpDateiDownload.Get('Datei.txt', 'G:\Projekte', false);
          {wie entpacken}
          {sobald Datei entpackt, über
           DOSDatum:=FileAge(Dateiname);
           WinDatum:=FileDateToDateTime(DOSDatum); anhand des Änderungsdatums prüfen, ob Datei aktueller ist, wenn ja       DB UPDATE}
        end;
    EXCEPT
      MessageDlg('Es ist ein Fehler beim Download aufgetreten, Prozess wird beendet', mtError, [mbOK], 0);
    END;
  FINALLY
    ftpDateiDownload.Quit;
  END;
end;

Sir Rufo 24. Feb 2011 13:49

AW: Änderungsdatum prüfen
 
Im Prinzip ja ... nur du kannst ja das Dateidatum schon vor dem Download prüfen lassen ;)

Ein (vernünftiger) FTP-Server gibt dir auch das Datei-Datum zurück.

Somit würde ich auf Anfrage dieses prüfen,
Die Datei dann in den Temp-Ordner laden
und von dort importieren.

Dadurch entlastest du auch den Anwender bzgl. Zeit und Auswahl, wohin die Datei denn soll :)

Metallicwar 24. Feb 2011 13:58

AW: Änderungsdatum prüfen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1084114)
Im Prinzip ja ... nur du kannst ja das Dateidatum schon vor dem Download prüfen lassen ;)

genauso, dass ich will ich ja, ist ja deutlich vorteilhafter, als erst die Datei zu downloaden, entpacken und dann auf Änderungsdatum prüfen. :)
Zitat:

Ein (vernünftiger) FTP-Server gibt dir auch das Datei-Datum zurück.
und mit welchem Befehl? FileAge werd ich ja hier nicht verwenden können.

Sir Rufo 24. Feb 2011 14:14

AW: Änderungsdatum prüfen
 
Zitat:

Zitat von Metallicwar (Beitrag 1084122)
Zitat:

Zitat von Sir Rufo (Beitrag 1084114)
Im Prinzip ja ... nur du kannst ja das Dateidatum schon vor dem Download prüfen lassen ;)

genauso, dass ich will ich ja, ist ja deutlich vorteilhafter, als erst die Datei zu downloaden, entpacken und dann auf Änderungsdatum prüfen. :)
Zitat:

Ein (vernünftiger) FTP-Server gibt dir auch das Datei-Datum zurück.
und mit welchem Befehl? FileAge werd ich ja hier nicht verwenden können.

FileAge prüft ja auch lokal vorhandene Dateien :roll:

Schau dir also mal die FTP-Befehle an

Metallicwar 24. Feb 2011 14:30

AW: Änderungsdatum prüfen
 
Delphi-Quellcode:
function FileDate(
    const AFileName: String,
    const AsGMT: Boolean = False
): TIdDateTime;
das scheint gut auszusehen, oder meintest du eine andere? ;)
wenn ich jetzte noch die Zugangsdaten zum FTP Server hätte, könnte ich vll auch mal sinnvoll testen, so bleibt mir wohl nichts anderes übrig als code zu tippen und hoffen, er funktiert :)

Metallicwar 24. Feb 2011 15:12

AW: Änderungsdatum prüfen
 
soo, hab mal was gecoded, kann aber nicht sagen, ob das so funktioniert:
Delphi-Quellcode:
procedure TfrmBankenDownload.Button1Click(Sender: TObject);
var
  iDOSDatumLokal: Integer;
  dtWINDatumLokal : TDateTime;
  sDateiEndung: String;
begin
  TRY
    TRY
      ftpDateiDownload.Username := 'admin';
      ftpDateiDownload.Password := 'passwort';
      ftpDateiDownload.Host := 'FTP SERVER';
      ftpDateiDownload.Connect;
      {Änderungsdatum der lokalen Datei herausfinden}
      iDOSDatumLokal := FileAge('C:\Importdateien\Datei.txt');
      dtWINDatumLokal := FileDateToDateTime(iDOSDatumLokal);
      {Abfrage, ob Datei auf Server aktueller als Datei Lokal}
      if ftpDateiDownload.FileDate('Datei.zip',false) > dtWINDatumLokal then
        if dlgDateiAbspeichern.Execute then
          begin
            {Datei downloaden und entpacken}
            ftpDateiDownload.Get('Datei.zip', dlgDateiAbspeichern.FileName, false);
            AbZIPEntpacken.FileName := 'C:\Importdateien\Datei_Neu.txt';
            AbZIPEntpacken.BaseDirectory := 'C:\Importdateien\';
            AbZIPEntpacken.ExtractFiles('*.*');
            {Tabelle leeren und neue Werte eintrage}
            qTabelleLeeren.SQL.Text := 'DELETE FROM Tabelle';
            qTabelleLeeren.ExecSQL;
            {Werte aus Datei (csv oder txt) in Datenbank schreiben}
            if dlgDateiEinelsen.Execute then
              sDateiendung := ExtractFileExt(ansilowercase(dlgDateiEinelsen.FileName));
              if sDateiendung = '.txt' then
                importFromTextfile(dlgDateiEinelsen.FileName)
              else
                importFromCSVfile(dlgDateiEinelsen.FileName);
          end;
    EXCEPT
      MessageDlg('Es ist ein Fehler beim Download aufgetreten, Prozess wird beendet', mtError, [mbOK], 0);
    END;
  FINALLY
    ftpDateiDownload.Quit;
    qTabelleLeeren.Close;
  END;
end;
Anregungen?
Fehler gefunden?

Sir Rufo 24. Feb 2011 15:17

AW: Änderungsdatum prüfen
 
Du solltest dir das Datum der Datei merken (in einer ini-Datei?) die du herunterlädst.
Die entpackte Datei hat definitiv ein anderes Datum ;) und könnte evtl. auch durch Zugriffe geändert werden

Dieses Datum nimmst du dann zum Vergleich

Metallicwar 24. Feb 2011 15:23

AW: Änderungsdatum prüfen
 
Zitat:

Die entpackte Datei hat definitiv ein anderes Datum
Ich prüfe doch erst die Datume der beiden Dateien ab, anschließend entpacke ich doch erst, oder versteh ich meinen eigenen Code nicht *grins*

Was mir aber noch auffällt, es besteht die Möglichkeit, dass ich bereits zwei Dateien lokal auf dem Rechner haben (eine CSV-Datei und eine Textdatei) kann. Also müssste ich noch irgendwie abprüfen, ob die Datei auf dem Server > .txt Datei > CSV-Datei ist, hmn ... Vorher müsste ich dann aber noch prüfen, ob auch beide Dateien im ORdner beinhaltet sind, oder nur eine, oder vll garkeine. hmn hmn ..

Sir Rufo 24. Feb 2011 15:28

AW: Änderungsdatum prüfen
 
Die ermittelst das Datum der lokalen Datei "Datei.txt"
und vergleichst das Datum mit der remote Datei "Datei.zip"
Diese wird entpackt und zum Vorschein kommt "Datei_Neu.txt"

Ich würde immer nur das Datum von "Datei.zip" vergleichen und abspeichern, wenn ich die herunterladen.
Aber jeder auf seine Art ;)

Metallicwar 24. Feb 2011 15:41

AW: Änderungsdatum prüfen
 
hmn, also meine Methode scheint mir auch richig zu sein *grins* :)
Zitat:

Diese wird entpackt und zum Vorschein kommt "Datei_Neu.txt"
ok, ich könnte die Datei, die gespeichert wird ja noch mit einem Time Stamp versehen, sieht mir schicker aus, wie dieses "Neu" :)
Aber leider kann ich noch nicht prüfen, ob mein Code soweit funktioniert und ob man das Datum der 2 Dateien über ein ">" prüfen kann.

DeddyH 24. Feb 2011 15:47

AW: Änderungsdatum prüfen
 
Könnte man nicht eine Prüfsumme (MD5 o.ä.) über die zu prüfende Datei ermitteln und auf dem Server ablegen? Dann müsste man nur die Datei, die diese Prüfsumme enthält, herunterladen, auslesen und mit der ebenfalls ermittelten Prüfsumme der lokalen Datei vergleichen. Damit geht man auch evtl. Problemen mit unterschiedlichen Zeiteinstellungen Client/Server aus dem Wege.

Sir Rufo 24. Feb 2011 15:54

AW: Änderungsdatum prüfen
 
Jeder entscheidet selber, ob er etwas programmiert, was nur dann funktioniert, wenn Voraussetzung 1..m eingehalten wurde,
oder es reicht wenn Voraussetzung 0..n eingehalten wurde. (mit n << m)

Denn leben muss der Programmierer selber damit (gut, die Anwender haben halt Glück oder Pech)

It's up to u ;)

DeddyH 24. Feb 2011 15:59

AW: Änderungsdatum prüfen
 
Sicher. Mich würde ja eher interessieren, ob sich die Datei inhaltlich geändert hat, statt das an irgendwelchen Änderungsdaten festzumachen. Allerdings hängt mein Vorschlag auch davon ab, ob es eine einfache Möglichkeit gibt, diese Prüfsummendatei auf dem Server abzulegen. Wenn das nicht geht muss man sich eben auf das Datum o.ä. verlassen und das Beste hoffen.

Sir Rufo 24. Feb 2011 16:14

AW: Änderungsdatum prüfen
 
Das Änderungsdatum ist definitiv nicht sehr geschickt ... (er wollte es aber haben ;) )

Beste Vorgehensweise wäre eine Versions-Angabe (zzgl. Hash-Wert) in einer separaten Steuerdatei zu hinterlegen.
Diese (kleine) Steuerdatei wird dann geholt und anhand des Inhalts entschieden, ob die Daten geladen werden müssen.

Mit dem Hash-Wert kann dann die geladenen Datei auf Übertragungsfehler überprüft und dann importiert werden.
Code:
[Datei.txt]
Version=1.0.0.1
Datum=23.02.2011 14:43:32
HASH=FAFAFAFAFAFAFAFFAFAFFFAFAFAAFFA
(als binäre Datei wäre die natürlich erheblich kleiner)

Metallicwar 24. Feb 2011 16:16

AW: Änderungsdatum prüfen
 
so ich nochmal, also ich werd bei dieser Variante bleiben, habe vor das bis morgen fertig zu stellen ;)
Den Code habe ich ja zum größten Teils schon, jetzte kann ich auch kompilieren (hab die Zugangsdaten :) )

Also den Fehler, den ich eben gepostet hab, habe ich behoben, werd jetzte mal weiterdurchsteppen und mal schaun, ob's funktioniert :P

Zitat:

Beste Vorgehensweise wäre eine Versions-Angabe (zzgl. Hash-Wert) in einer separaten Steuerdatei zu hinterlegen.
Diese (kleine) Steuerdatei wird dann geholt und anhand des Inhalts entschieden, ob die Daten geladen werden müssen.
Hört sich gut an. Wenn ich mehr Zeite hätte würde ich mich da mal einarbeiten, aber die Zeit habe ich nicht, da ich das heute noch fertig machen muss + Stored Procedure schreiben muss + Formulardesign anpassen und und und :)

Metallicwar 24. Feb 2011 16:32

AW: Änderungsdatum prüfen
 
soo, jetzte hab ich einen Fehler, bei dem ich leider selbst nicht weiter gekommen bin.
Code:
            ftpDateiDownload.Get('Bankdaten.zip', dlgDateiAbspeichern.FileName, false);
Folgende Fehlermeldung: Unable to build data connection: Connection timed out

Metallicwar 24. Feb 2011 20:43

AW: Änderungsdatum prüfen
 
Habe mal ein wenig recherchiert:
Folgende Lösungsmöglichkeiten, wo mir vll weiter helfen könnten:

1.Check your firewall setting. Turn it off if you are not sure
--> Firewall hab ich ausgemacht, tritt der Fehler immer noch auf.
2. Change FTP client?connection type to active mode. ie. Passive mode off
--> Wo in den Komponente kann ich bitte schön den Connection Type auf active stellen?


Oder liegt es an was ganz anderem?

Sir Rufo 24. Feb 2011 22:13

AW: Änderungsdatum prüfen
 
Zitat:

Zitat von Metallicwar (Beitrag 1084240)
Habe mal ein wenig recherchiert:
Folgende Lösungsmöglichkeiten, wo mir vll weiter helfen könnten:

1.Check your firewall setting. Turn it off if you are not sure
--> Firewall hab ich ausgemacht, tritt der Fehler immer noch auf.
2. Change FTP client?connection type to active mode. ie. Passive mode off
--> Wo in den Komponente kann ich bitte schön den Connection Type auf active stellen?


Oder liegt es an was ganz anderem?

Ich würde mal eher vermuten du musst den Passive-Mode einschalten.
(es ist auch nicht schlimm, wenn man sich mit den Grundlagen der Technik vertraut macht die man benutzen will, also hier FTP)

Da du auch nicht mitteilst welche Komponente du als FTP-Client einsetzt kann es da auch nicht mehr Hilfe geben :glaskugel:

Metallicwar 24. Feb 2011 22:32

AW: Änderungsdatum prüfen
 
Verwende von den Indy Clients die TIdFTP !
Eine Eigenschaft Passiv gibt es da, gleich mal probieren ;)

Metallicwar 24. Feb 2011 22:41

AW: Änderungsdatum prüfen
 
ok, er kann sich jetzte schonmal jedenfalls auf den FTP Server verbinden, meint aber, dass er die Datei nicht finden kann.
Delphi-Quellcode:
ftpDateiDownload.Get('Bankdaten.zip', dlgDateiAbspeichern.FileName, false);
hmn ...
Diese Zeile öffnet mir mein SaveDialog, ich kann einen Dateinamen angeben unter der die Datei gespeichert werden soll. Als Dateityp hab ich .ZIP vorgegeben (Filter)
Kann ich aber nicht auch irgendwie sagen, dass ich einfach sagen kann wohin er speichern soll, nicht wie?

Metallicwar 25. Feb 2011 08:56

AW: Änderungsdatum prüfen
 
Problem vorerst gelöst, danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz