AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Delphi Indy Datei via URL downloaden und temporär öffnen?
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi Indy Datei via URL downloaden und temporär öffnen?

Ein Thema von CG2003 · begonnen am 6. Jun 2019 · letzter Beitrag vom 3. Jul 2019
Antwort Antwort
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Delphi Indy Datei via URL downloaden und temporär öffnen?

  Alt 17. Jun 2019, 17:01
Hallo,
Zitat:
so lange sie geöffnet ist
danach DeleteFile benutzen, oder habe ich das was ganz falsch verstanden?
Heiko
  Mit Zitat antworten Zitat
CG2003

Registriert seit: 8. Nov 2003
Ort: Hamburg
470 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Delphi Indy Datei via URL downloaden und temporär öffnen?

  Alt 17. Jun 2019, 17:11
Das geht aber nur in einem Loop solange meine Applikation läuft.
Ich würde gern die Datei zum Löschen markieren so dass - sie sobald sie nicht mehr geöffnet ist - gelöscht wird.
Sebastian M.
Viele Grüße aus Hamburg


Meine Website: www.sebastian-mundt.com
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

AW: Delphi Indy Datei via URL downloaden und temporär öffnen?

  Alt 17. Jun 2019, 18:11
Wie wäre es mit CreateFile und dem Flat FILE_FLAG_DELETE_ON_CLOSE?

Zitat:
The file is to be deleted immediately after all of its handles are closed, which includes the specified handle and any other open or duplicated handles.

If there are existing open handles to a file, the call fails unless they were all opened with the FILE_SHARE_DELETE share mode.

Subsequent open requests for the file fail, unless the FILE_SHARE_DELETE share mode is specified.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
CG2003

Registriert seit: 8. Nov 2003
Ort: Hamburg
470 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Delphi Indy Datei via URL downloaden und temporär öffnen?

  Alt 17. Jun 2019, 19:27
Hallo Michael,

das klingt an sich nicht schlecht aber...

ich erstelle momentan die Datei aus einem Stream:

Code:
procedure TfrmSearch.lvSearchDblClick(Sender: TObject);
begin
   Stream := TMemoryStream.Create;
    try
      IdHTTP.HandleRedirects := True;
        IdHTTP.Get(Host + '/restapi/index.php/document/' + String(lvSearch.Items.Item[i].Data) + '/content', Stream);
        Stream.SaveToFile(GetSpecialFolder(CSIDL_APPDATA) + '\' + ResponseFileName);
    except
      on E:Exception do begin
          ShowMessage('Fehler: ' + E.Message);
        end;
    end;
    Stream.Free;
end;
CreateFile jedoch erstellt die Datei ja auch und ich kann da ja nur einen Dateinamen übergeben, jedoch keinen Stream oder habe ich was übersehen?
Sebastian M.
Viele Grüße aus Hamburg


Meine Website: www.sebastian-mundt.com
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Delphi Indy Datei via URL downloaden und temporär öffnen?

  Alt 17. Jun 2019, 19:30
Du bekommst ein Dateihandle zurück. Eventuell kannst du den an den Stream übergeben.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.014 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Delphi Indy Datei via URL downloaden und temporär öffnen?

  Alt 18. Jun 2019, 18:52
Wie wäre es mit CreateFile und dem Flat FILE_FLAG_DELETE_ON_CLOSE?

Zitat:
...
Subsequent open requests for the file fail, unless the FILE_SHARE_DELETE share mode is specified.
Diese Einschränkung bedeutet: die temporäre Datei, die mit FILE_FLAG_DELETE_ON_CLOSE geöffnet wird, kann nur dann von der anderen Anwendung (z.B. PDF Reader) geöffnet werden, wenn diese auch beim Öffnen das Flag FILE_SHARE_DELETE angibt. Beschrieben hier:

https://stackoverflow.com/questions/...-on-close-flag

Es kommt dann vermutlich die Fehlermeldung: "The process cannot access the file because it is being used by another process."
Michael Justin
habarisoft.com

Geändert von mjustin (18. Jun 2019 um 18:55 Uhr)
  Mit Zitat antworten Zitat
CG2003

Registriert seit: 8. Nov 2003
Ort: Hamburg
470 Beiträge
 
Delphi 2009 Professional
 
#7

AW: Delphi Indy Datei via URL downloaden und temporär öffnen?

  Alt 26. Jun 2019, 09:51
Hallo zusammen,

ich lade die Datei momentan so herunter in einen MemoryStream:

Delphi-Quellcode:
    Stream := TMemoryStream.Create;
    IdHTTP.HandleRedirects := True;
    IdHTTP.Get('http://192.168.178.244/restapi/index.php/document/4/content', Stream);
    Memo1.Text := IdHTTP.Response.RawHeaders.Text;
    ResponseFileNameTemp := StringReplace(IdHTTP.Response.RawHeaders.Values['Content-Disposition'], 'attachment; filename="', '', [rfReplaceAll]);
    ResponseFileName := StringReplace(ResponseFileNameTemp, '"', '', [rfReplaceAll]);
    Stream.SaveToStream(CreateUnbuffedFilestream(GetSpecialFolder(CSIDL_APPDATA) + '\' + ResponseFileName));

Die Funktion "CreateUnbufferedFilestream" sieht so aus:

Delphi-Quellcode:
function CreateUnbuffedFilestream(const filename:string):TStream;
var FileHandle, hnd : THandle;
begin
  FileHandle := CreateFile(PChar(filename), GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY or FILE_FLAG_DELETE_ON_CLOSE, 0);
  if hnd <> INVALID_HANDLE_VALUE then begin
    result := THandleStream.Create(FileHandle);
    ShellExecute(Application.Handle, 'open', PChar(filename), nil, nil, sw_show);
  end else
    result := nil;
end;

Das funktioniert soweit jedoch kann die Dtaei mittels ShellExecute nicht geöffnet werden. Bekomme da immer die Meldung dass die Datei in Benutzung ist.
Sebastian M.
Viele Grüße aus Hamburg


Meine Website: www.sebastian-mundt.com

Geändert von CG2003 (26. Jun 2019 um 10:31 Uhr)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.014 Beiträge
 
Delphi 2009 Professional
 
#8

AW: Delphi Indy Datei via URL downloaden und temporär öffnen?

  Alt 26. Jun 2019, 16:02
Das funktioniert soweit jedoch kann die Dtaei mittels ShellExecute nicht geöffnet werden. Bekomme da immer die Meldung dass die Datei in Benutzung ist.
Das könnte das in Beitrag #21 vernutete Verhalten von Windows sein. Die Anwendung, die mit ShellExecute gestartet wird, benutzt nicht das laut Doku für FILE_FLAG_DELETE_ON_CLOSE notwendige Flag FILE_SHARE_DELETE.
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
CG2003

Registriert seit: 8. Nov 2003
Ort: Hamburg
470 Beiträge
 
Delphi 2009 Professional
 
#9

AW: Delphi Indy Datei via URL downloaden und temporär öffnen?

  Alt 26. Jun 2019, 17:24
Hmm schade, in meinem Beispiel war das jetzt der Adobe Reader.
Gibt es denn eine andere Möglichkeit???
Sebastian M.
Viele Grüße aus Hamburg


Meine Website: www.sebastian-mundt.com
  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 20:42 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