![]() |
Delete file in Verbindung mit INDY idHTTP get
Hallo,
ich habe folgendes Problem: mit
Delphi-Quellcode:
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.
sl := TStringList.Create;
htp := TIdHTTP.Create(Self); SL.Values['size'] := '180'; s := htp.Post('http://www.josefkoller.de/aus_delphi1.php', SL); ... 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:
Nun das Problem:
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; 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
Delphi-Quellcode:
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.
if DelFile('C:\borland\IMKEREIDB_IMP.sqlite') = true then
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 |
AW: Delete file in Verbindung mit INDY idHTTP get
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; |
AW: Delete file in Verbindung mit INDY idHTTP get
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 |
AW: Delete file in Verbindung mit INDY idHTTP get
Du kannst die Prozedur wie folgt vereinfachen:
Delphi-Quellcode:
Nun zur Erklärung:
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; Es ist nicht nötig die Datei explizit zu Löschen; dies wird schon durch
Delphi-Quellcode:
veranlasst.
fmCreate
Wichtig ist auch die Angabe von
Delphi-Quellcode:
.
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. |
AW: Delete file in Verbindung mit INDY idHTTP get
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz