AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delete file in Verbindung mit INDY idHTTP get
Thema durchsuchen
Ansicht
Themen-Optionen

Delete file in Verbindung mit INDY idHTTP get

Ein Thema von josefkoller · begonnen am 13. Feb 2013 · letzter Beitrag vom 14. Feb 2013
Antwort Antwort
josefkoller

Registriert seit: 22. Okt 2012
49 Beiträge
 
#1

Delete file in Verbindung mit INDY idHTTP get

  Alt 13. Feb 2013, 10:20
Hallo,

ich habe folgendes Problem:

mit
Delphi-Quellcode:
  sl := TStringList.Create;
  htp := TIdHTTP.Create(Self);
  SL.Values['size'] := '180';
  s := htp.Post('http://www.josefkoller.de/aus_delphi1.php',
    SL);
 ...
schicke ich einen Wert an ein php-Script. Ab dem übergebenden Wert werden auf dem Server mit dem php Script Datensätze aus einer mySQL DB ausgelesen und in eine SQLite DB geschrieben.

Das funktioniert auch so wie es soll.

Dann hole ich diese SQLite DB mittels http get vom Server und speichere sie auf dem lokalen Rechner.

Delphi-Quellcode:
procedure ...
var
  lStream: TFileStream;
  htp2: TIdHTTP;
begin
  htp2 := TIdHTTP.Create(self);
  try
     if fileexists('C:\borland\IMKEREIDB_IMP.sqlite') then
     begin
       if DelFile('C:\borland\IMKEREIDB_IMP.sqlite') = true then
       begin
        lStream:=TFileStream.Create('C:\borland\IMKEREIDB_IMP.sqlite', fmCreate or fmShareDenyNone);
        HTP2.Get('http://www.josefkoller.de/IMKEREIDB_IMP.sqlite',lStream);
       end else
        ShowMessage('Fehler Datei löschen');
      end else
      begin
        lStream:=TFileStream.Create('C:\borland\IMKEREIDB_IMP.sqlite', fmCreate or fmShareDenyNone);
        HTP2.Get('http://www.josefkoller.de/IMKEREIDB_IMP.sqlite',lStream);
      end;
  finally
    lStream.Free;
    htp2.Free;
  end;
end;
Nun das Problem:

Wenn ich das ganze mehrmals aufrufe, wird die vormalige Datei nicht "richtig" gelöscht.

Soll heißen:
Ich rufe das Script mit unterschiedlichen Werten auf (einmal 190, dann 200, dann 220, usw.).
Die Importdatei müßte nun einmal die Datensättze ab der ID 190, dann ab der ID 200 und dann ab der 220 enthalten.
Auf dem lokalen Rechner ist aber immer die Datei mit den Datensätzen ab 190 da.

Es muß mit der Zeile

   if DelFile('C:\borland\IMKEREIDB_IMP.sqlite') = true then Die Datei wird zwar beim 2. Durchlauf gelöscht und der Stream erzeugt auch eine neue Datei mit dem gleichen Namen, aber es wird eben immer wieder die erstmalig unter diesem Namen erzeugte Datei erzeugt.

Wenn ich den Dateinamen mit jedem Aufruf verändere, also

'C:\borland\IMKEREIDB_IMP.sqlite' = Datensätze ab 190
dann
'C:\borland\IMKEREIDB_IMP1.sqlite' = Datensätze ab 200
dann
'C:\borland\IMKEREIDB_IMP2.sqlite' = Datensätze ab 2200
usw.

ist alles richtig. Die Datei hat die gewünschte Anzahl von Datensätzen.

Wie kann ich die Datei auf dem lokalen Rechner, also 'C:\borland\IMKEREIDB_IMP.sqlite', so löschen,
daß sie auch richtig weg ist und bei wiederholtem Erzeugen nicht immer die erstmalig Erzeugte wieder regeneriert wird.

Vielen Dank

Josef
  Mit Zitat antworten Zitat
josefkoller

Registriert seit: 22. Okt 2012
49 Beiträge
 
#2

AW: Delete file in Verbindung mit INDY idHTTP get

  Alt 13. Feb 2013, 10:22
Entschuldigung

ich hab die DelFile Funktion vergessen:

Delphi-Quellcode:
function DelFile(const AFile: string): boolean;
var
  sh: SHFileOpStruct;
begin
  ZeroMemory(@sh, sizeof(sh));
  with sh do
  begin
    Wnd := Application.Handle;
    wFunc := fo_Delete;
    pFrom := PChar(AFile + #0);
    fFlags := fof_Silent or fof_NoConfirmation;
  end;
  result := SHFileOperation(sh) = 0;
end;
  Mit Zitat antworten Zitat
josefkoller

Registriert seit: 22. Okt 2012
49 Beiträge
 
#3

AW: Delete file in Verbindung mit INDY idHTTP get

  Alt 14. Feb 2013, 10:38
Hallo,

ich denke, ich bin mit meiner Sucherei nach meinem Problem einen Schritt weiter.
- Ich hab in dem php Script an relevanten Stellen Variablen gesetzt und dann diese Variablen im
Ergebnisstring des http get's überprüft.

- ich hab nach jedem Aufruf von http.get die erzeugte SQLite DB mit einem anderen ftp Programm
abgeholt.

Ergebnis:

Das php Script läuft nach jedem http Get fehlerlos.
In der SQLite DB stehen immer die richtige Anzahl an Datensaätzen ( je nachdem, mit welchem Paramter
(SL.Values['size1'] := sEdit1.Text; ich die Procedure aufgerufen habe.)

Es kann also nur am http.get liegen, nicht an der delete Geschichte im filesystem des lokalen Rechners.

Kann es sein, daß die "http get"-Geschichte zu langsam ist, um bei wiederholtem Aufruf der Procedure, die "richtige" SQLite Datei zu übertragen?

Wird http nicht "richtig geleert", auch wenn ich mit jedem Procedureaufruf die Komponente zerstöre und mit create neu erzeuge?

Kennt sich mit dieser INDY http Komponente jemand besser aus als ich?

wie ihr seht, sind meine Kenntnisse diesbezüglich begrenzt. Ich komm einfach nicht recht weiter.

vielen Dank

Josef
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Delete file in Verbindung mit INDY idHTTP get

  Alt 14. Feb 2013, 12:02
Du kannst die Prozedur wie folgt vereinfachen:
Delphi-Quellcode:
procedure ...
var
  lStream: TFileStream;
  htp2: TIdHTTP;
  filename : string;
begin
  filename := 'IMKEREIDB_IMP.sqlite';
  htp2 := TIdHTTP.Create(nil);
  lStream := nil;
  try
     lStream:=TFileStream.Create('C:\borland\'+filename, fmCreate or fmShareExclusive);
     HTP2.Get('http://www.josefkoller.de/'+filename,lStream);
  finally
    lStream.Free;
    htp2.Free;
  end;
end;
Nun zur Erklärung:
Es ist nicht nötig die Datei explizit zu Löschen; dies wird schon durch fmCreate veranlasst.
Wichtig ist auch die Angabe von fmShareExclusive .
Solange die Datei heruntergeladen wird, möchtest du nicht, dass irgendjemand die Datei im Zugriff hat.
Sollte die Datei noch anderweitig geöffnet sein, dann wird beim Öffnen des FileStreams eine Exception erzeugt.
  Mit Zitat antworten Zitat
josefkoller

Registriert seit: 22. Okt 2012
49 Beiträge
 
#5

AW: Delete file in Verbindung mit INDY idHTTP get

  Alt 14. Feb 2013, 20:49
Hallo,

vielen Dank für die Prozedur.

Ich mache aber mittlerweile meine "Datenimportierei" mittels superobject.pas.

Ich kam mit der http.get - Geschichte einfach auf keinen grünen Zweig.

ciao

Josef
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:23 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