PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Temporäre Datei löschen lassen


Darkstar
2004-06-10, 15:08:08
Folgendes kniffliges Problem:
Ich erzeuge aus meinem (Delphi-)Programm heraus eine temporäre XLS-Datei. Diese soll anschließend von einer passenden Tabelenkalkulation geöffnet und nach deren Beendigung gelöscht werden. Mein Programm soll sich direkt nach dem Starten der Tabellenkalkulation anderen Dingen zuwenden und sich nicht mehr um die Beseitung der temporären Datei kümmern müssen.

Ich habe schon einen nicht funktionierenden Ansatz:
XLS-Datei wird mit Flag FILE_FLAG_DELETE_ON_CLOSE erzeugt das Flag sorgt dafür, daß nach dem Schließen der letzten Instanz, die Zugriff auf die Datei hat, die Datei gelöscht wird Tabellenkalkulation wird mit ShellExecute(Handle, FileName, …) gestartetDas Problem ist, daß ich der Tabellenkalkulation beim Start nicht mitteilen kann, daß sie die Datei im Modus FILE_SHARE_DELETE öffnen muß (ansonsten schlägt das Öffnen fehl).

Hat jemand eine Idee oder einen anderen Ansatz?

Gast
2004-06-10, 20:44:29
Kannst du nicht einfach aus deinem Programm heraus eine CMD-Datei erzeugen, mit folgendem Inhalt:


c:\blablabla\excel.exe c:\blablabla\mytempfile.xls
del c:\blablabla\mytempfile.xls


Und das startet du, anstatt Excel direkt zu starten.

Eine andere Möglichkeit wäre, wenn dir das schwarze Fenster von cmd.exe nicht gefällt, ein kleines Delphiprogramm zu schreiben, das Excel startet, wartet bis Excel fertig ist und dann das Tempfile löscht. Das startest du dann aus deinem Programm heraus und kannst mit diesem sofort weiterarbeiten.

Oder dein Programm könnte die Tempdatei einfach so lassen, wie sie ist und erst beim Programmende den ganzen Müll aufräumen. Oder du schreibst einen Garbage Collector, der im Hintergrund immer wieder prüft, ob die Tempfiles noch in Benutzung sind und sie gegebenenfalls löscht.

Hoffe, das sind genug Denkanstöße. ;)

Darkstar
2004-06-10, 21:42:57
Original geschrieben von Gast
Kannst du nicht einfach aus deinem Programm heraus eine CMD-Datei erzeugen, mit folgendem Inhalt:
c:\blablabla\excel.exe c:\blablabla\mytempfile.xls
del c:\blablabla\mytempfile.xls
Und das startet du, anstatt Excel direkt zu starten.Ich bin mir nicht ganz sicher, ob jede Tabellenkalkulation (ja, es gibt noch andere neben Excel ;)) als Übergabeparameter die zu öffnende Datei erwartet.Eine andere Möglichkeit wäre, wenn dir das schwarze Fenster von cmd.exe nicht gefällt, […]Das kommt natürlich noch hinzu. Also: :abgel:[…] ein kleines Delphiprogramm zu schreiben, das Excel startet, wartet bis Excel fertig ist und dann das Tempfile löscht. Das startest du dann aus deinem Programm heraus und kannst mit diesem sofort weiterarbeiten.Stimmt, das könnte funktionieren.Oder dein Programm könnte die Tempdatei einfach so lassen, wie sie ist und erst beim Programmende den ganzen Müll aufräumen. Oder du schreibst einen Garbage Collector, der im Hintergrund immer wieder prüft, ob die Tempfiles noch in Benutzung sind und sie gegebenenfalls löscht.Die beiden Punkte fallen leider aus, da man das Programm schon beenden dürfen soll, wenn die Excel-Datei noch geöffnet ist.Hoffe, das sind genug Denkanstöße. ;) Das Extra-Programm kommt meinen Wünschen schon am nächsten, nur befürchte ich, daß es in dieser Form nicht 100%ig ins Konzept paßt (mein Delphi-Programm darf nur aus einer EXE bestehen). Trotzdem danke! :up:

x-dragon
2004-06-11, 09:53:33
Damit kannst du rausfinden, mit welchem Programm die XLS-Datei verknüpft ist und kannst sie so vielleicht besser überwachen:
http://www.delphipraxis.net/topic6738_mit+welcher+anwendung+ist+eine+datei+verknuepft.html

Gast
2004-06-12, 21:08:31
Original geschrieben von Darkstar
Ich bin mir nicht ganz sicher, ob jede Tabellenkalkulation (ja, es gibt noch andere neben Excel ;))
Ich erzeuge aus meinem (Delphi-)Programm heraus eine temporäre XLS-Datei.Naja. Bei XLS-Datei bin ich halt von Excel ausgegangen.

Aus Erfahrung kann ich dir sowieso nur empfehlen, selber etwas zu schreiben. Beim nächsten Update der Tabellenkalkulation ändert sich garantiert was beim Aufruf, so dass dein Programm nicht mehr funktioniert. Also am besten gar nicht die Tabellenkalkulation aufrufen, sondern die XLS-Datei, die die zugeordnete Applikation dann automatisch startet. Eine Hintergrundüberwachung stellt dann fest, ob die temprären Dateien noch gebraucht werden.

Ich könnte mir also vorstellen, dass deine Anwendung startet, die Hintergrundüberwachung einschaltet, dann die graphische Oberfläche deines Programms anzeigt. Wenn der Anwender dein Programm beendet, dann blendest du nur die sichtbaren Teile aus. Die Hintergrundüberwachung läuft weiter, bis die letzte tempöräre Datei gelöscht ist. Dann beendet sie sich selbst.
Das könntest du auch alles in ein Exefile (warum auch immer das so sein muss) stecken.

Darkstar
2004-06-12, 21:54:05
Original geschrieben von Gast
Also am besten gar nicht die Tabellenkalkulation aufrufen, sondern die XLS-Datei, die die zugeordnete Applikation dann automatisch startet.Wird mit ShellExecute(…, FileName, …) wie oben geschrieben schon erledigt (FileName ist in diesem Fall die XLS-Datei). Ich hatte mich nur ein wenig mißverständlich ausgedrückt.Ich könnte mir also vorstellen, dass deine Anwendung startet, die Hintergrundüberwachung einschaltet, dann die graphische Oberfläche deines Programms anzeigt. Wenn der Anwender dein Programm beendet, dann blendest du nur die sichtbaren Teile aus. Die Hintergrundüberwachung läuft weiter, bis die letzte tempöräre Datei gelöscht ist. Dann beendet sie sich selbst.
Das könntest du auch alles in ein Exefile (warum auch immer das so sein muss) stecken. So in etwa werde ich es wohl machen.


Nochmal vielen Dank für die schnellen Antworten!