![]() |
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:01 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