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?

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
Seite 3 von 4     123 4   
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#21

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
 
#22

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.004 Beiträge
 
Delphi 2009 Professional
 
#23

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
 
#24

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
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#25

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

  Alt 27. Jun 2019, 10:39
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...
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#26

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

  Alt 27. Jun 2019, 11:19
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

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.
Angehängte Dateien
Dateityp: rar TemporaryFilemanager.rar (51,9 KB, 9x aufgerufen)
Peter Below
  Mit Zitat antworten Zitat
CG2003

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

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

  Alt 3. Jul 2019, 11:45
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.
Sebastian M.
Viele Grüße aus Hamburg


Meine Website: www.sebastian-mundt.com
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#28

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

  Alt 3. Jul 2019, 11:54
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 .

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.
Peter Below
  Mit Zitat antworten Zitat
CG2003

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

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

  Alt 3. Jul 2019, 11:58
Klasse Tip, genau so mache ich das mal. Danke Dir!
Sebastian M.
Viele Grüße aus Hamburg


Meine Website: www.sebastian-mundt.com
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#30

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

  Alt 3. Jul 2019, 12:54
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..
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 18:51 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