Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Problem mit Datei schließen (https://www.delphipraxis.net/151517-problem-mit-datei-schliessen.html)

-Phantom- 20. Mai 2010 20:18


Problem mit Datei schließen
 
Hey Leute,

Ich habe vor eine Datei mit der indy Komponente runterzuladen. Dabei hat man aber die Möglichkeit den Download abzubrechen.
Das hatte ich so zu machen:
Ich erstelle eine globale Var.
und wenn man auf "Abbrechen klickt" wird die var. auf true gesetzt.
So egal ob man auf Abbrechen klickt oder nicht die Datei soll erst mal ganz runtergeladen werden. Wenn nun die var. auf True ist soll die Datei am ende gelöscht werden.

So lade ich herunter:
Delphi-Quellcode:
var
ini : Tinifile;
begin
button2.Enabled := false;
createdir(edit1.Text);
speicherpfad := edit1.Text;
ini := Tinifile.Create(speicherpfad+'Einstellungen.ini');
responseStream := TFileStream.Create(speicherpfad+'Phantom_Zip_v2.exe', fmCreate);
IdHTTP1.Get('http://phantomzip.ph.funpic.de/Phantom_Zip_v2.exe', responseStream);
responseStream.free;
und so mache ich das mit Abbrechen
Delphi-Quellcode:
procedure TForm3.IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
if abbrechen = false then begin
sgauge1.Progress := 100;
form4.show;
form3.Hide;
end;
if abbrechen then begin
sgauge1.Progress := 100;
deletefile(speicherpfad+'Phantom_Zip_v2.exe');
Das Problem ist: Das die Datei nicht geschlossen wird, es kommt die Meldung das die Datei noch ausgeführt ist.

Aber ist mit "responseStream.free;" die Datei nicht geschlossen?

mkinzler 20. Mai 2010 20:21

Re: Problem mit Datei schließen
 
Nein, es wird nur die Klasse freigegeben
Btw: Besser
Delphi-Quellcode:
if not abbrechen then

-Phantom- 20. Mai 2010 20:23

Re: Problem mit Datei schließen
 
Oke habe ich geändert...

Aber wie schließe ich die Datei nun?

Mit fileclose? geht ja schlecht weil ich dazu ein Integer brauche und "speicherpfad+'Phantom_Zip_v2.exe" ist leider ein String ^^

// und responseStream.close gibt es nicht -.- :wall:

mkinzler 20. Mai 2010 20:35

Re: Problem mit Datei schließen
 
Hab noch einmal nachgesehen. Das Freigeben des Streams sollte die Datei schliessen.

H4ndy 20. Mai 2010 20:36

Re: Problem mit Datei schließen
 
Was bringt dir das abbrechen, wenn du eh komplett runterlaedst? Wenn du das so abarbeitest, dann brauchst du den Code auch nicht in OnWorkEnd zu packen, sondern kannst ihn direkt nach HTTP.get einbauen:

Delphi-Quellcode:
responseStream := TFileStream.Create(speicherpfad+'Phantom_Zip_v2.exe', fmCreate);

IdHTTP1.Get('http://phantomzip.ph.funpic.de/Phantom_Zip_v2.exe', responseStream);
responseStream.free; // Freigeben, schliesst auch das Handle
if abbrechen then begin
  sgauge1.Progress := 100;
  deletefile(speicherpfad+'Phantom_Zip_v2.exe'); // loeschen
end;

-Phantom- 20. Mai 2010 20:40

Re: Problem mit Datei schließen
 
Vielen Danke ich werde es ausprobieren

/ kann nicht gehen weil
Delphi-Quellcode:
var
ini : Tinifile;
begin
button2.Enabled := false;
createdir(edit1.Text);
speicherpfad := edit1.Text;
ini := Tinifile.Create(speicherpfad+'Einstellungen.ini');
responseStream := TFileStream.Create(speicherpfad+'Phantom_Zip_v2.exe', fmCreate);
IdHTTP1.Get('http://phantomzip.ph.funpic.de/Phantom_Zip_v2.exe', responseStream);
responseStream.free;
Ja den download auslöst und das Abbrechen kommt ja erst danach?!
Dann müsste man ja vorher abbrechen drücken :D bevor man den Download startet

// oder liege ich falsch?

-Phantom- 20. Mai 2010 21:54

Re: Problem mit Datei schließen
 
Wie kann es den sein das mit
Delphi-Quellcode:
responseStream.free;
die Datei nicht geschlossen wird?

Soll ich mehr Code hier reinstellen?

DeddyH 21. Mai 2010 08:05

Re: Problem mit Datei schließen
 
Wie wäre es denn, wenn Du mal Gebrauch von try-finally-Blöcken machen würdest?
Delphi-Quellcode:
Dings := TDings.Create;
try
  Dings.MachWas();
finally
  Dings.Free;
end;
Ansonsten wird das Free nie ausgeführt, wenn zwischen Erzeugen und Freigeben eine Exception eintritt.

-Phantom- 21. Mai 2010 12:46

Re: Problem mit Datei schließen
 
habs nun so gemacht :
Delphi-Quellcode:
try
responseStream := TFileStream.Create(speicherpfad+'Phantom_Zip_v2.exe', fmCreate);
IdHTTP1.Get('http://phantomzip.ph.funpic.de/Phantom_Zip_v2.exe', responseStream);
finally
responseStream.free;
// und das hab ich auch probiert
responseStream := TFileStream.Create(speicherpfad+'Phantom_Zip_v2.exe', fmCreate);
try
IdHTTP1.Get('http://phantomzip.ph.funpic.de/Phantom_Zip_v2.exe', responseStream);
finally
responseStream.free;
Es kommt aber immer noch die Meldung... langsam verzweifle ich :wall: :wall: :wall: :wall: :wall:

Andreas L. 21. Mai 2010 13:59

Re: Problem mit Datei schließen
 
Das WorkEnd-Ereignis wird von TIdHTTP direkt nach dem Download aufgerufen also noch bevor die Datei mir Stream.Free; geschlossen wird.

Zitat:

Ja den download auslöst und das Abbrechen kommt ja erst danach?!
Dann müsste man ja vorher abbrechen drücken Very Happy bevor man den Download startet
Du musst im OnWork von TIdHTTP sowie nach dem .Get Application.ProcessMessages aufrufen damit 1. die GUI nicht einfriert und 2. der User auf den Abbrechen-Button klicken kann bevor deine Löschen-Abfrage kommt.

-Phantom- 21. Mai 2010 15:51

Re: Problem mit Datei schließen
 
Zitat:

Du musst im OnWork von TIdHTTP sowie nach dem .Get Application.ProcessMessages aufrufen
Was den aufrufen ? Den download? Das Löschen? Das Abbrechen?

Andreas L. 21. Mai 2010 15:56

Re: Problem mit Datei schließen
 
Zitat:

Zitat von -Phantom-
Zitat:

Du musst im OnWork von TIdHTTP sowie nach dem .Get Application.ProcessMessages aufrufen
Was den aufrufen ? Den download? Das Löschen? Das Abbrechen?

Delphi-Quellcode:
Application.ProcessMessages;

-Phantom- 21. Mai 2010 16:01

Re: Problem mit Datei schließen
 
Bei dem Button "Download" hab ich nun das stehen:
Delphi-Quellcode:
procedure TForm3.Button2Click(Sender: TObject);
var
ini : Tinifile;
begin
button2.Enabled := false;
createdir(edit1.Text);
speicherpfad := edit1.Text;
ini := Tinifile.Create(speicherpfad+'Einstellungen.ini');
responseStream := TFileStream.Create(speicherpfad+'Phantom_Zip_v2.exe', fmCreate);
try
IdHTTP1.Get('http://phantomzip.ph.funpic.de/Phantom_Zip_v2.exe', responseStream);
finally
responseStream.free;
Und das bei idhttp1.onwork
Delphi-Quellcode:
procedure TForm3.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
sgauge1.Progress := AworkCount;
if abbrechen then begin
sgauge1.Progress := 100;
Application.ProcessMessages;
deletefile(speicherpfad+'Phantom_Zip_v2.exe');
end;
end;
So was mache ich falsch es kommt immer noch die Fehlermedlung

-Phantom- 21. Mai 2010 18:13

Re: Problem mit Datei schließen
 
Habs nun hinbekommen das die Meldung nicht mehr kommt und das die Datei gelöscht wird
Delphi-Quellcode:
//download
procedure TForm3.Button2Click(Sender: TObject);
var
ini : Tinifile;
begin
button3.Enabled := False;
button2.Enabled := false;
createdir(edit1.Text);
speicherpfad := edit1.Text;
ini := Tinifile.Create(speicherpfad+'Einstellungen.ini');
responseStream := TFileStream.Create(speicherpfad+'Phantom_Zip_v2.exe', fmCreate);
try
IdHTTP1.Get('http://phantomzip.ph.funpic.de/Phantom_Zip_v2.exe', responseStream);
finally
responseStream.free;
Das beim Abbrechen
Delphi-Quellcode:
procedure TForm3.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
sgauge1.Progress := AworkCount;
if abbrechen then begin
sgauge1.Progress := 100;
responseStream.Free;
deletefile(speicherpfad+'Phantom_Zip_v2.exe');
form1.Close;
end;
Es kommt nun eine Fehlermeldung von Delphi wenn ich das Programm ausführe aber die geht sofort wieder weg ?! naja egal Hauptsache es geht nun

rollstuhlfahrer 21. Mai 2010 19:39

Re: Problem mit Datei schließen
 
Du kannst auch einen THandleStream nehmen, musst allerdings vorher mittels CreateFile() die Datei öffnen und kannst diese dann nach dem .Free wunderbar mit CloseHandle() schließen, wenn das Destroy das nicht für dich übernimmt.

Bernhard

PS: Ansonsten komisches Verhalten: Meiner Meinung nach sollte die Datei nach FileStream.Free geschlossen sein, sodass man sie auch löschen kann.

EDIT: Die Fehlermeldung ist sofort weg, weil du das Programm schließt.

-Phantom- 22. Mai 2010 08:32

Re: Problem mit Datei schließen
 
ja ich weiß... ^^ aber das Programm macht alles reicht das nicht? Ich hab mich damit nun 2 Tage auseinander gesetzt nur damit man den Download abbrechen kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:54 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