![]() |
E/A Error 103 nervt :(
Hallo! Folgendes :
Delphi-Quellcode:
Klappt Alles, aber wen nich während des Kopierens auf Abbrechen klicke (Button4)
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. 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? |
Re: E/A Error 103 nervt :(
Hi,
mach mal das Break vo deinem Exit weg, dann geht das besser... Grüße vom marabu |
Re: E/A Error 103 nervt :(
Kommt aufs Selbe raus :(
|
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 |
Re: E/A Error 103 nervt :(
Das ist ganz normal, schau einfach mal in die Hilfe zu "exit"
Auszug: Zitat:
Du könntest z.B. im finally-Block auf stopped abfragen... Gruß Poolspieler |
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:
Definiere lError als Integer lokal in der Procedure...
{$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)]); |
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 :) |
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...
|
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 |
Re: E/A Error 103 nervt :(
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:25 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 by Thomas Breitkreuz