Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit TFileStream (und DeleteFile) (https://www.delphipraxis.net/34181-problem-mit-tfilestream-und-deletefile.html)

Helmi 18. Nov 2004 20:12


Problem mit TFileStream (und DeleteFile)
 
Hallo Jungs,

ich habe ein Problem mit einem TFileStream (und DeleteFile).

Kurze Erklärung:

mit ...
Code:
If FileExists(SaveFile) then
 DeleteFile(SaveFile);
... wird vorsichtshalber die Datei (SaveFile) gelöscht ...

... mit ...
Code:
ZielDatei := TFileStream.Create(SaveFile, fmCreate);
wir dann die Datei (SaveFile) erzeugt.


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:

Im Projekt Monitor_Client.exe ist eine Exception der Klasse EFCreateError aufgetreten. Meldung: 'Datei "E:\Delphi\ISDN-Monitor Client\Client_Update.exe" kann nicht erstellt werden. Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
Gibt es ne Möglichkeit mit TFileStream trotzdem die Datei zu createn auch wenn es sich nicht mit DeleteFile löschen lässt?

mfg
Helmi

jim_raynor 18. Nov 2004 20:24

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.

Helmi 18. Nov 2004 20:30

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

Luckie 18. Nov 2004 20:44

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.

Helmi 18. Nov 2004 21:02

Re: Problem mit TFileStream (und DeleteFile)
 
der Herr will Code, hier hadda Code :-D :

Code:
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;
vor dem ZielDatei := TFileStream.Create wird ZielDatei nirgends verwendet

Sprint 18. Nov 2004 23:34

Re: Problem mit TFileStream (und DeleteFile)
 
Zitat:

Zitat von Helmi
Eigenartiger weise kann man mit DeleteFile diese Exe nicht löschen (keine Ahnung warum)

Dann mach doch mal...
Delphi-Quellcode:
  if not DeleteFile(SaveFile) then
    ShowMessage(SysErrorMessage(GetLastError));
Vielleicht sagt dir Windows ja warum du die Datei nicht löschen kannst.

jim_raynor 19. Nov 2004 05:51

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.

Helmi 19. Nov 2004 09:52

Re: Problem mit TFileStream (und DeleteFile)
 
also aufgerufen wird sie durch:

Code:
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;
mit der Variablen Working wird ja das zweimal-Aufrufen verhindert

DerDan 19. Nov 2004 11:34

Re: Problem mit TFileStream (und DeleteFile)
 
wie heist denn deine exe und wie die exe die du löschen willst?

Helmi 19. Nov 2004 11:37

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 11:49 Uhr.
Seite 1 von 2  1 2      

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