Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi E/A Error 103 nervt :( (https://www.delphipraxis.net/53157-e-error-103-nervt.html)

Rastaman 11. Sep 2005 13:35


E/A Error 103 nervt :(
 
Hallo! Folgendes :

Delphi-Quellcode:
unit uMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ProgressBar: TProgressBar;
    OpenDialog1: TOpenDialog;
    Button2: TButton;
    Button3: TButton;
    Label1: TLabel;
    SaveDialog1: TSaveDialog;
    Button4: TButton;
    procedure Button4Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
   function copywithprogress(Src, Dest: String): Boolean;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Stopped: Boolean;

implementation

{$R *.dfm}
{$WARNINGS OFF}

function TForm1.copywithprogress(Src, Dest: String): Boolean;
const
  BufferSize = 102400; //100 KByte
var
  SizeOfFile, BytesCopied: LongInt;
  Size: Integer;
  Buffer: Array [0..BufferSize] of Byte;
  FInFile, FOutFile: File;
  Time: Cardinal;
  FilePathSource, FilePathDestination: String;
begin
  Result := False;

  if not fileexists(Src) then
  begin
    raise Exception.Create('Source File Doesnt Exist');
    exit;
  end;

  if Src = Dest then
  begin
    raise EInOutError.Create('Source and Destination File are equal');
    exit;
  end;

  Stopped := False;
  Time := GetTickCount;
  AssignFile(FInFile, Src);
  AssignFile(FOutFile, Dest);
  try //Reset Try BEGIN
    Reset(FInFile,1);
    try //ReWrite Try BEGIN
      ReWrite(FOutFile,1);
      try
        SizeOfFile := FileSize(FInFile);
        ProgressBar.Max := SizeOfFile;
        ProgressBar.Position := 0;
        BytesCopied := 0;

        FilePathSource := ExtractFilePath(Src);
        FilePathDestination := ExtractFilePath(Dest);
        if Length(FilePathSource) > 20 then
          FilePathSource := Copy(FilePathSource,1,15) + '...';
        if Length(FilePathDestination) > 20 then
          FilePathDestination := Copy(FilePathDestination,1,15) + '...';
        Label1.Caption := 'Von ' + FilePathSource + ' nach ' + FilePathDestination;
        repeat
          if stopped = True then
          begin
            CloseFile(FInFile);
            CloseFile(FOutFile);
            Progressbar.Position := 0;
            Label1.Caption := '';
            Form1.Caption := 'FileCopy';
            if MessageBox(Self.Handle,
                          'Copying Process Stopped. Delete The Destination File?',
                          'Stopped',
                          MB_YESNO
                          or MB_ICONQUESTION) = ID_YES then
              DeleteFile(SaveDialog1.FileName);
            Result := False;
            break;
            Exit;
          end;
          BlockRead(FInFile, Buffer, BufferSize, Size);
          Inc(BytesCopied, Size);
          Form1.Caption := 'MBytes Copied: ' + IntToStr(BytesCopied div 1024 div 1024);
          ProgressBar.Position := BytesCopied;
          BlockWrite(FOutFile, Buffer, Size);
          Application.ProcessMessages;
        until Size < BufferSize;
      finally
        RaiseLastOSError;
      end;
    finally //ReWrite Try Finally
      CloseFile(FOutFile);
    end; //ReWrite Try END
  except //Reset Try Finally
    CloseFile(FInFile);
  end; //Reset Try END
  Result := True;
  Time := GetTickCount - Time;
  Form1.Caption := Form1.Caption + ' Finished in ' + IntToStr(Time) + ' ms';

end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  Button4.Enabled := True;
  if CopyWithProgress(OpenDialog1.FileName, SaveDialog1.FileName) then
    MessageBox(Self.Handle,
               'Copying Finished',
               'Information',
                MB_ICONINFORMATION);
  Button4.Enabled := False;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    SaveDialog1.Filter := StrLower(PChar(ExtractFileExt(OpenDialog1.FileName)));
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  if OpenDialog1.FileName = '' then
  begin
    MessageBox(Self.Handle,
               'Please Select A Source File First',
               'Information',
               MB_ICONINFORMATION);
    exit;
  end;

  if SaveDialog1.Execute then
   if StrLower(PChar(ExtractFileExt(Savedialog1.FileName))) <> Savedialog1.Filter then
     SaveDialog1.FileName := SaveDialog1.FileName + SaveDialog1.Filter;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  Stopped := True;
end;

end.
Klappt Alles, aber wen nich während des Kopierens auf Abbrechen klicke (Button4)
und das dann halt in der Schleife aufgerufen wird, dann kommt die Abfrage, alles gut, aber
dann E/A Error 103. Prog läuft weiter, Datei is je nach JA oder NEIN gelöscht, aber der Fehler nervt halt.
Ausserdem beende ich ja dann mit Exit die procedure --> das Closefile aus dem finally kann eigentlich nicht
mehr aufgerufen werden. Trotzdem 103 :gruebel:
Hat einer ne Ahnung worans liegt?

marabu 11. Sep 2005 13:39

Re: E/A Error 103 nervt :(
 
Hi,

mach mal das Break vo deinem Exit weg, dann geht das besser...

Grüße vom marabu

Rastaman 11. Sep 2005 13:41

Re: E/A Error 103 nervt :(
 
Kommt aufs Selbe raus :(

marabu 11. Sep 2005 13:45

Re: E/A Error 103 nervt :(
 
Nimm den integrierten Debugger und schalte "Bei Delphi-Exceptions stoppen" ein. Setze dann einen break point auf das Exit und lass nochmal laufen. Jetzt solltest du sehen wo er langläuft und stolpert.

marabu

Poolspieler 11. Sep 2005 13:46

Re: E/A Error 103 nervt :(
 
Das ist ganz normal, schau einfach mal in die Hilfe zu "exit"
Auszug:
Zitat:

Delphi-Syntax:

procedure Exit;

Beschreibung

In Delphi entzieht die Prozedur Exit der aktuellen Prozedur sofort die Programmsteuerung. Ist die aktuelle Prozedur das Hauptprogramm, wird die Anwendung beendet.

Nach dem Aufruf von Exit wird die aufrufende Routine mit der nach dem Prozeduraufruf folgenden Anweisung fortgesetzt.

Hinweis: Exit beschränkt sich nicht auf einen Block, sondern beendet die gesamte Prozedur. Exit beeinflusst die Ablaufsteuerung von try..finally-Blöcken nicht. Wenn Sie Exit in einem try..finally-Konstrukt aufrufen, wird die Ausführung in der finally-Klausel fortgesetzt.
Abhilfe:
Du könntest z.B. im finally-Block auf stopped abfragen...

Gruß

Poolspieler

Muetze1 11. Sep 2005 13:56

Re: E/A Error 103 nervt :(
 
1. Vor dem CloseFile() des InFiles mach mal aus dem Except ein Finally so wie beim OutFile, damit dieses immer geschlossen wird.
2. Wenn du wegen eines Fehler die Procedure nach den Try's verlässt mit Exit, dann schmeiss dort die CloseFile() raus, weil bei einem Exit werden die Finally Blöcke trotzdem durchlaufen und somit die Dateien geschlossen (siehe Hilfe Zitat zuvor)
3. Der E/A Fehler von 103 bedeutet, das die Datei nicht geöffnet wurde. Wenn du nun die Datei zuvor durch ein Abbruch nicht ordentlich mit CloseFile() geschlossen hast, dann kann er das nächste mal diese nicht wieder ordentlich öffnen und dann kommt bei Lese-/Schreibversuchen der Fehler. Daher prüfe bitte bei Reset() und ReWrite() auch ab, ob das Öffnen erfolgreich war. Die reine Existenz der Datei sagt nix aus.

Delphi-Quellcode:
  {$I-}
  Reset(FINFile, 1);
  {$I+}
  lError := IOError;

  If ( lError = 0 ) Then
  Begin
    // erfolgreich
  End
  Else
    Raise EInOutError.CreateFmt('Fehler %d beim öffnen der Datei: %s', [lError, SysErrorMessage(lError)]);
Definiere lError als Integer lokal in der Procedure...

Rastaman 11. Sep 2005 14:03

Re: E/A Error 103 nervt :(
 
Jo Danke es klappt.
Kommt zwar (nur wenn aus Delphi ausgeführt) der Fehler "Aufruf einer Betriebssystemfunktion ist fehlgeschlagen"
aber den sieht man nicht, wenn man die exe so ausführt.

Eine Sache aber noch: Welche Zahl nehm ich am Besten für die Konstante BufferSize?
Jetz sinds ja 100 kb, aber wie gehts am schnellsten?
Der Windows Kopier-Dialog ist nämlich immer noch schneller.

//EDIT: Verdammt, jetz wird dieser Betriebssystemfehler auch ausserhalb von Delphi angezeigt...
//EDIT2: Hat sich erledigt mit dem Fehler :)

Muetze1 11. Sep 2005 14:12

Re: E/A Error 103 nervt :(
 
Wie wäre es denn mit Streams zu arbeiten anstatt mit den alten Pascal Dateiroutinen? Und selbst dann gibt es noch die Alternative selbst den "Windows-Kopierdialog" zu bemühen. Den kannst du ja schliesslich auch selber aufrufen...

Rastaman 11. Sep 2005 14:15

Re: E/A Error 103 nervt :(
 
jo mit streams habe ich es zuerst versucht
da haben 100 mb 80 sekunden gedauert :lol: oder ich hab was falsch gemacht...

2 Steams
Jeweils öffnen mit der in und out datei
aus dem ersten lesen und in den 2 scheiben.
Dauert ne ewigkeit ...

//Edit:Ausserdem hatte ich damit auch Probleme

Phistev 11. Sep 2005 15:11

Re: E/A Error 103 nervt :(
 
Delphi-Referenz durchsuchenTFileStream.CopyFrom


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:25 Uhr.
Seite 1 von 2  1 2      

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 by Thomas Breitkreuz