![]() |
Problem mit TFileStream (und DeleteFile)
Hallo Jungs,
ich habe ein Problem mit einem TFileStream (und DeleteFile). Kurze Erklärung: mit ...
Code:
... wird vorsichtshalber die Datei (SaveFile) gelöscht ...
If FileExists(SaveFile) then
DeleteFile(SaveFile); ... mit ...
Code:
wir dann die Datei (SaveFile) erzeugt.
ZielDatei := TFileStream.Create(SaveFile, fmCreate);
SaveFile ist zu diesem Zeitpunkt eine ExeDDatei (c:\test.exe) Eigenartiger weise kann man mit DeleteFile diese Exe nicht löschen (keine Ahnung warum) Danach kommt die Zeil mit dem ZielDatei und dann bekomm ich folgende Meldung: Zitat:
mfg Helmi |
Re: Problem mit TFileStream (und DeleteFile)
Normalerweise wird diese Datei neu erstellt und überschrieben. Ich vermute das auf die Exe noch zugegriffen wird oder die Exe gestartet ist. Deshalb funktioniert auch das Löschen nicht.
|
Re: Problem mit TFileStream (und DeleteFile)
die exe ist zu diesem Zeitpunkt nicht in Gebrauch und wurde auch zuvor nicht benutzt und wird nicht benutzt
|
Re: Problem mit TFileStream (und DeleteFile)
Hast du auch irgendwo vor dem Löschen auch TFileStream.Free aufgerufen, um die Datei wieder zu schließen? Zeig mal etwas mehr Code.
|
Re: Problem mit TFileStream (und DeleteFile)
der Herr will Code, hier hadda Code :-D :
Code:
vor dem ZielDatei := TFileStream.Create wird ZielDatei nirgends verwendet
var
zielDatei: TFileStream; begin //Cursor = Sanduhr Screen.Cursor := crHourglass; try //Prüfen ob Datei schon vorhanden, wenn ja, löschen If FileExists(SaveFile) then DeleteFile(SaveFile); ZielDatei := TFileStream.Create(SaveFile, fmCreate); ProgressBar_Update.Position := 0; pbReceived := fSize; //Datei empfangen und speichern while True do begin nReceived := Socket.ReceiveBuf(Buffer, sizeof(Buffer)); if nReceived <= 0 then Break else ZielDatei.WriteBuffer(Buffer, nReceived); Sleep(300); pbReceived := pbReceived - nReceived; ProgressBar_Update.Position := 100 - ((pbReceived * 100) div fSize); Application.ProcessMessages; end; ZielDatei.Position := 0; finally FreeAndNil(zielDatei); end; //Cursor = Normal Screen.Cursor := crDefault; |
Re: Problem mit TFileStream (und DeleteFile)
Zitat:
Delphi-Quellcode:
Vielleicht sagt dir Windows ja warum du die Datei nicht löschen kannst.
if not DeleteFile(SaveFile) then
ShowMessage(SysErrorMessage(GetLastError)); |
Re: Problem mit TFileStream (und DeleteFile)
Wo wird denn diese Funktion aufgerufen? Ich kann mir vorstellen, dass die Funktion ein zweites mal aufgerufen wird, während sie beim Empfang der Daten ist (also in der Schleife). Durch das Application.ProcessMessage ist es durchausmöglich. Dann wäre die Datei durch den Filestream noch geöffnet.
|
Re: Problem mit TFileStream (und DeleteFile)
also aufgerufen wird sie durch:
Code:
mit der Variablen Working wird ja das zweimal-Aufrufen verhindert
procedure TForm1.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket); {...} begin if not Working then begin //Variable setzen Working := True; //Cursor = Sanduhr Screen.Cursor := crHourglass; try //Prüfen ob Datei schon vorhanden, wenn ja, löschen If FileExists(SaveFile) then DeleteFile(SaveFile); ZielDatei := TFileStream.Create(SaveFile, fmCreate); ProgressBar_Update.Position := 0; pbReceived := fSize; //Datei empfangen und speichern while True do begin nReceived := Socket.ReceiveBuf(Buffer, sizeof(Buffer)); if nReceived <= 0 then Break else ZielDatei.WriteBuffer(Buffer, nReceived); Sleep(300); pbReceived := pbReceived - nReceived; ProgressBar_Update.Position := 100 - ((pbReceived * 100) div fSize); Application.ProcessMessages; end; ZielDatei.Position := 0; finally FreeAndNil(zielDatei); end; //Cursor = Normal Screen.Cursor := crDefault; //Prüfen ob die angekommene Datei die Größe der Original-Datei hat If FileExists(SaveFile) and (GetFileSize(SaveFile) = fSize) then begin //Variable löschen Buffer := ''; //Kommando senden Socket.SendText('GOTFILE!'); //TrayIcon beschreiben TrayIcon.Icon := IconRot; If New_Client_Update then begin //Timer Update enablen Timer_Update.Enabled := true; //Label beschreiben LabelTimer_Update_Info.TimeOutEnabled := false; LabelTimer_Update_Info.Caption := 'Update wurde empfangen und wird jetzt installiert!'; Label_Date_Time.Caption := FormatDateTime('d. mmmm yyyy hh:mm:ss', Now) + ' Uhr'; end else begin //Timer Update disablen Timer_Update.Enabled := false; //Progressbar wieder auf 0 setzen ProgressBar_Update.Position := 0; //Label beschreiben LabelTimer_Update_Info.TimeOutEnabled := true; LabelTimer_Update_Info.Caption := 'Datei wurde übertragen!'; end; end else begin //Timer Update disablen Timer_Update.Enabled := false; //Progressbar wieder auf 0 setzen ProgressBar_Update.Position := 0; //Variable löschen Buffer := ''; //Datei löschen DeleteFile(SaveFile); //Label beschreiben LabelTimer_Update_Info.TimeOutEnabled := true; LabelTimer_Update_Info.Caption := 'Fehler beim Empfangen der Datei!'; //Kommando senden Socket.SendText('FILEERROR!'); end; //Umschalten auf Kommando-Empfang ClientStatus := csIdle; //Variable beschreiben Working := False; end; |
Re: Problem mit TFileStream (und DeleteFile)
wie heist denn deine exe und wie die exe die du löschen willst?
|
Re: Problem mit TFileStream (und DeleteFile)
was willst du genau wissen?
ach ja - ich hab mal vergessen zu erwähnen dass nicht nur exe-dateien erzeugt werden, bzw übertragen sondern alle möglichen dateien können übertragen werden |
Re: Problem mit TFileStream (und DeleteFile)
wie heist denn deine exe und wie die exe die du löschen willst?
|
Re: Problem mit TFileStream (und DeleteFile)
irgendwie hängt die Platte :-)
die exe heisst genau so wie die die ich löschen will!! realisiert durch die Variable SaveFile - die einmal beschrieben wird!! |
Re: Problem mit TFileStream (und DeleteFile)
Das dacht ich mir,
denn genau das geht nicht, eine exe kann sich nicht selber löschen |
Re: Problem mit TFileStream (und DeleteFile)
falsch!!
denn die Exe (wie gesagt es können auch andere dateien sein) ist nicht die Exe des Programmes - sondern eine andere Exe die zu diesem Zeitpunkt nicht läuft! |
Re: Problem mit TFileStream (und DeleteFile)
Jetzt mal langsam,
es geht garantiert nicht eine exe zu löschen die gerade läuft! ich find es seltsam anzunehmen, das das geht, nur weil DU es nicht hinbekommst überhaupt eine Exe oder andere Datei zu löschen. |
Re: Problem mit TFileStream (und DeleteFile)
ich glaub ich schreib chinesisch :-)
ich lösche nicht die Exe des Programmes das gerade läuft also von der application von der aus ich lösche!! sondern eine Datei bzw eine Exe von der ich weiss dass sie nicht läuft ( weil ich sie ja selber starte oder beende) |
Re: Problem mit TFileStream (und DeleteFile)
Das Problem ist doch so wie ich beschrieben habe. Du öffnest die Datei mit einem FileStream und liest dann Daten ein. Solange der FileStream existiert ist die Datei gesperrt und kann weder gelöscht, noch ein weiterer FileStream zu dieser Datei geöffnet werden. Setze einfach mal zwei Haltepunkte in der Procedure. einmal beim "TFileStream.Create" und einmal in beim FreeAndNil .
Wenn du jetzt das Prog startest, wird ja irgendwann am ersten Haltepunkt angehalten. Das Ereigniss wurde also ausgelöst. Wenn du jetzt mit F9 fortfährst sollte er als nächstes am Ende halten. Wenn das passiert ist alles korrekt. Es kann aber auch passieren, dass er wieder in der ersten Zeile anhält und genau dann wird das DeleteFile und TFileStream.Create krachen. Die Prozedur wurde ja noch nicht beendet und der Filestream dementsprechend noch nicht freigegeben. [edit]oh shitt, warum kann ich den Beitrag nicht mehr löschen :wall: :wall: [/edit] |
Re: Problem mit TFileStream (und DeleteFile)
Zitat:
Delphi-Quellcode:
Den Dateinamen anzeigen zu lassen...
procedure TForm1.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket); {...} begin if not Working then begin //Variable setzen Working := True; ShowMessage(SaveFile); //<- hier anzeigen lassen |
Re: Problem mit TFileStream (und DeleteFile)
ich weiss mir keinen Rat mehr
ich hab euch mal mein projekt als anhang angehängt Aled und LabelTimer dienen nur zur anzeige - sind also unwichtig mfg helmi |
Re: Problem mit TFileStream (und DeleteFile)
Vielleicht solltest du bei csIdle nicht Working auf false zurücksetzen. Nur so ne spontane Idee.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:09 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