Einzelnen Beitrag anzeigen

Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#8

Re: Problem mit TFileStream (und DeleteFile)

  Alt 19. Nov 2004, 09:52
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
  Mit Zitat antworten Zitat