Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Delphi Indy Datei via URL downloaden und temporär öffnen? (https://www.delphipraxis.net/200914-delphi-indy-datei-via-url-downloaden-und-temporaer-oeffnen.html)

mjustin 18. Jun 2019 18:52

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

Zitat von Luckie (Beitrag 1434865)
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."

CG2003 26. Jun 2019 09:51

AW: Delphi Indy Datei via URL downloaden und temporär öffnen?
 
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.

mjustin 26. Jun 2019 16:02

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

Zitat von CG2003 (Beitrag 1435368)
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.

CG2003 26. Jun 2019 17:24

AW: Delphi Indy Datei via URL downloaden und temporär öffnen?
 
Hmm schade, in meinem Beispiel war das jetzt der Adobe Reader.
Gibt es denn eine andere Möglichkeit???

mjustin 27. Jun 2019 10:39

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

Zitat von CG2003 (Beitrag 1435421)
Hmm schade, in meinem Beispiel war das jetzt der Adobe Reader.
Gibt es denn eine andere Möglichkeit???

Nicht, wenn man keine Änderungen an den vom ShellExecute zum Öffnen verwendeten Flags vornehmen kann...

peterbelow 27. Jun 2019 11:19

AW: Delphi Indy Datei via URL downloaden und temporär öffnen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von CG2003 (Beitrag 1435421)
Hmm schade, in meinem Beispiel war das jetzt der Adobe Reader.
Gibt es denn eine andere Möglichkeit???

Sieh Dir mal das Archiv in der Anlage an. Extrahiere den Inhalt in ein Verzeichnis, in dem der Compiler die Files finden kann, füge PB.TmporaryFilesManagerU zu deiner Uses-Klausel hinzu. Dann kannst Du mit

Delphi-Quellcode:
TemporaryFilesManager.Add(aFilenameWithFullPath);
Eine Datei zu einer internen Liste hinzufügen, die dann beim Schließen der Anwendung automatisch gelöscht werden. Allerdings geht das nur, wenn die Datei nicht auch noch in einer externen Anwendung geöffnet ist.

CG2003 3. Jul 2019 11:45

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

danke, das funktioniert perfekt.
Schön wäre jetzt noch eine Möglichkeit, die temporäre(n) Datei(en) zu löschen die nicht gelöscht werden konnten, weil die
Applikation noch offen war, aber das könnte man ja mit einem geplanten Task evtl. lösen.

peterbelow 3. Jul 2019 11:54

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

Zitat von CG2003 (Beitrag 1435903)
Hallo Peter,

danke, das funktioniert perfekt.
Schön wäre jetzt noch eine Möglichkeit, die temporäre(n) Datei(en) zu löschen die nicht gelöscht werden konnten, weil die
Applikation noch offen war, aber das könnte man ja mit einem geplanten Task evtl. lösen.

Es gibt schon einen Grund, wieso das temp-Verzeichnis im Laufe der Zeit so viel Schrott ansammelt :wink:.

Was Du relativ leicht machen kannst ist folgendes: lege die temporären Dateien in einem Unterordner des temp-Verzeichnisses ab. Den kannst Du dann einfach bei jedem Programmstart leerputzen, damit bleiben die nicht gelöschten Dateien nur bis zur nächsten Session liegen.

CG2003 3. Jul 2019 11:58

AW: Delphi Indy Datei via URL downloaden und temporär öffnen?
 
Klasse Tip, genau so mache ich das mal. Danke Dir!

HolgerX 3. Jul 2019 12:54

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

Alternative:

MoveFileEx(PChar(YourFileToDelete), nil, MOVEFILE_DELAY_UNTIL_REBOOT)

Erzeuge deine Dateien ganz normal und rufe dann direkt hierfür die obrige MoveFileEx funktion auf.

Nun dein ShellExecute und die Datei kann geöffnet/Angezeigt werden.

Beim nächsten Reboot von Windows werden diese Dateien gelöscht.
Ist nicht schön, dass dies erst beim Reboot erfolgt, aber immerhin.. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:13 Uhr.
Seite 3 von 4     123 4      

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