AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

E/A Error 103 nervt :(

Ein Thema von Rastaman · begonnen am 11. Sep 2005 · letzter Beitrag vom 11. Sep 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Rastaman
Rastaman

Registriert seit: 6. Jan 2005
Ort: Lübbecke
575 Beiträge
 
Turbo C++
 
#1

E/A Error 103 nervt :(

  Alt 11. Sep 2005, 12:35
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
Hat einer ne Ahnung worans liegt?
Chuck Norris has counted to infinity ... twice!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: E/A Error 103 nervt :(

  Alt 11. Sep 2005, 12:39
Hi,

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

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Rastaman
Rastaman

Registriert seit: 6. Jan 2005
Ort: Lübbecke
575 Beiträge
 
Turbo C++
 
#3

Re: E/A Error 103 nervt :(

  Alt 11. Sep 2005, 12:41
Kommt aufs Selbe raus
Chuck Norris has counted to infinity ... twice!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: E/A Error 103 nervt :(

  Alt 11. Sep 2005, 12:45
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
  Mit Zitat antworten Zitat
Poolspieler

Registriert seit: 9. Aug 2004
165 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: E/A Error 103 nervt :(

  Alt 11. Sep 2005, 12:46
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
Andreas
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: E/A Error 103 nervt :(

  Alt 11. Sep 2005, 12:56
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...
  Mit Zitat antworten Zitat
Benutzerbild von Rastaman
Rastaman

Registriert seit: 6. Jan 2005
Ort: Lübbecke
575 Beiträge
 
Turbo C++
 
#7

Re: E/A Error 103 nervt :(

  Alt 11. Sep 2005, 13:03
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
Chuck Norris has counted to infinity ... twice!
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: E/A Error 103 nervt :(

  Alt 11. Sep 2005, 13:12
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...
  Mit Zitat antworten Zitat
Benutzerbild von Rastaman
Rastaman

Registriert seit: 6. Jan 2005
Ort: Lübbecke
575 Beiträge
 
Turbo C++
 
#9

Re: E/A Error 103 nervt :(

  Alt 11. Sep 2005, 13:15
jo mit streams habe ich es zuerst versucht
da haben 100 mb 80 sekunden gedauert 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
Chuck Norris has counted to infinity ... twice!
  Mit Zitat antworten Zitat
Phistev
(Gast)

n/a Beiträge
 
#10

Re: E/A Error 103 nervt :(

  Alt 11. Sep 2005, 14:11
Delphi-Referenz durchsuchenTFileStream.CopyFrom
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:50 Uhr.
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