复制文件的问题!极易拿分!(100分)

  • 主题发起人 主题发起人 rejoise
  • 开始时间 开始时间
R

rejoise

Unregistered / Unconfirmed
GUEST, unregistred user!
我想从光盘复制一个文件到指定地点,光盘有一点坏了,这个文件可能有一部分
读不出来。我的想法是逐个字符从文件里读出,再逐个字符写到指定文件里。
如果某个字符读不出来,则重试几次,实在不行跳过读下个字符
请问大虾如何复制字符???如何捕捉读不出来的错误???我急啊!
 
用blockread和blockwrite
//以下delphi的help document
var

; FromF, ToF: file;
; NumRead, NumWritten: Integer;
; Buf: array[1..2048] of Char;
begin
; if OpenDialog1.Execute then ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; { Display Open dialog box }
; begin
; ; AssignFile(FromF, OpenDialog1.FileName);
; ; Reset(FromF, 1); { Record size = 1 }
; ; if SaveDialog1.Execute then ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;{ Display Save dialog box}
; ; begin
; ; ; AssignFile(ToF, SaveDialog1.FileName); { Open output file }

; ; ; Rewrite(ToF, 1); { Record size = 1 }
; ; ; Canvas.TextOut(10, 10, 'Copying ' + IntToStr(FileSize(FromF))
; ; ; ; + ' bytes...');
; ; ; repeat
; ; ; ; BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
; ; ; ; BlockWrite(ToF, Buf, NumRead, NumWritten);
; ; ; until (NumRead = 0) or (NumWritten <> NumRead);
; ; ; ; CloseFile(FromF);
; ; ; ; CloseFile(ToF);
; ; end;
; end;
end;
 
正确的程序应该为:

用blockread和blockwrite
//以下delphi的help document

{$I-} ;// 必须加
Procedure CopyErrorFile();
var
; FromF, ToF: file;
; NumRead, NumWritten: Integer;
; Buf: array[1..2048] of Char;
begin
; if OpenDialog1.Execute then ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; { Display Open dialog box }
; begin
; ; AssignFile(FromF, OpenDialog1.FileName);
; ; Reset(FromF, 1); { Record size = 1 }
; ; if SaveDialog1.Execute then ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;{ Display Save dialog box}
; ; begin
; ; ; AssignFile(ToF, SaveDialog1.FileName); { Open output file }

; ; ; Rewrite(ToF, 1); { Record size = 1 }
; ; ; Canvas.TextOut(10, 10, 'Copying ' + IntToStr(FileSize(FromF))
; ; ; ; + ' bytes...');
; ; ; repeat
; ; ; ; BlockRead(FromF, Buf, SizeOf(Buf)); ;// 改
; ; ; ; If (IOResult<>0) Then Asm NOP End; ; // 新加
; ; ; ; BlockWrite(ToF, Buf, SizeOf(Buf)); ; // 改
; ; ; ; If (IOResult<>0) Then Asm NOP End; ; // 新加
; ; ; until (FEof(FormF));// 改
; ; ; ; CloseFile(FromF);
; ; ; ; CloseFile(ToF);
; ; end;
; end;
end;
 
如果读不出来,返回什么错误?
 
关注。。。
 
wql,我有几个问题继续请教!继续加分!!!
正确的程序应该为:
//以下delphi的help document
{$I-} ; // 这一句为什么要加,什么意思?
Procedure CopyErrorFile();
var
; FromF, ToF: file;
; NumRead, NumWritten: Integer;
; Buf: array[1..2048] of Char;
begin
; if OpenDialog1.Execute then ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
; begin
; ; AssignFile(FromF, OpenDialog1.FileName);
; ; Reset(FromF, 1); { Record size = 1 } //Reset这句什么意思?
; ; if SaveDialog1.Execute then ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
; ; begin
; ; ; AssignFile(ToF, SaveDialog1.FileName);

; ; ; Rewrite(ToF, 1); { Record size = 1 } //为何用rewrite不用reset?
; ; ; Canvas.TextOut(10, 10, 'Copying ' + IntToStr(FileSize(FromF))
; ; ; ; + ' bytes...');
; ; ; repeat
; ; ; ; BlockRead(FromF, Buf, SizeOf(Buf)); ;
; ; ; ; If (IOResult<>0) Then Asm NOP End; ; // Asm NOP End是何意?
; ; ; ; BlockWrite(ToF, Buf, SizeOf(Buf)); ;
; ; ; ; If (IOResult<>0) Then Asm NOP End; ;
; ; ; until (Eof(FromF));
; ; ; ; CloseFile(FromF);
; ; ; ; CloseFile(ToF);
; ; end;
; end;
另外,如果源文件是只读文件,拷贝出来只是2KB文件,为什么,该怎么做?
 
{$I-} 是忽略I/O错误
reset是读文件,rewrite是写文件
如果原文件是只读,reset前把FileMode:=fmOpenRead;
 
收藏先。多谢
 
{ 自主版权,你可以放心使用,可以拷贝只读文件和错误文件 }
{$I-} ;// 可以捕获错误
Procedure CopyErrorFile(sFile,tFile:String);
;Const
; ; ; ; ; CIIPCopyBufSz : Integer = $ffff; { 64K }
;Var
; ; ; ; ; sFl ; ; ; ; ; : HFile;
; ; ; ; ; tFl ; ; ; ; ; : File;
; ; ; ; ; LastByteS ; ; ,
; ; ; ; ; TmCt ; ; ; ; ;,
; ; ; ; ; FlSize ; ; ; ;: Integer; // Must Use Integer.
; ; ; ; ; _Buf ; ; ; ; ;: Pointer;
; Function ;FCopyOneBlock(_FCount:Integer):Boolean;
; Begin
; ; ; ; ; Application.ProcessMessages;
; ; ; ; ; If (_LRead(sFl,_Buf,_FCount)=HFILE_ERROR) Then
; ; ; ; ; Begin { 若读出错,不必理会,继续拷贝 }
; ; ; ; ; ; GetLastError;
; ; ; ; ; End;
; ; ; ; ; BlockWrite(tFl,_Buf^,_FCount);
; ; ; ; ; Result:=(IoResult=0);
; End;

;Begin
; ; ; ; ; // 打开源文件读:
; ; ; ; ; sFl:=_LOpen(PChar(sFile),OF_READ);
; ; ; ; ; If (sFl=HFILE_ERROR) Then
; ; ; ; ; Begin
; ; ; ; ; ; GetLastError;
; ; ; ; ; ; Exit;
; ; ; ; ; End;
; ; ; ; ; // 得到长度:
; ; ; ; ; FlSize:=Integer(Windows.GetFileSize(sFl,Nil));
; ; ; ; ; If (DWord(FlSize)=$FFFFFFFF) Then
; ; ; ; ; Begin
; ; ; ; ; ; GetLastError();
; ; ; ; ; ; If (_LClose(sFl)=HFILE_ERROR) Then
; ; ; ; ; ; ; ;GetLastError;
; ; ; ; ; ; Exit;
; ; ; ; ; End;

; ; ; ; ; // 计算拷贝次数
; ; ; ; ; TmCt:=Integer(FlSize Div CIIPCopyBufSz);
; ; ; ; ; LastByteS:=Integer(FlSize-TmCt*CIIPCopyBufSz);

; ; ; ; ; // 分配内存
; ; ; ; ; GetMem(_Buf,CIIPCopyBufSz);

; ; ; ; ; // 打开目标文件写:
; ; ; ; ; AssiGn(tFl,tFile);
; ; ; ; ; ReWrite(tFl,1);
; ; ; ; ; If (IoResult<>0) Then
; ; ; ; ; Begin
; ; ; ; ; ; If (_LClose(sFl)=HFILE_ERROR) Then
; ; ; ; ; ; ; ;GetLastError;
; ; ; ; ; ; FreeMem(_Buf,CIIPCopyBufSz);
; ; ; ; ; ; Exit;
; ; ; ; ; End;

; ; ; ; ; // 开始拷贝
; ; ; ; ; While (TmCt>0) Do
; ; ; ; ; Begin
; ; ; ; ; ; FCopyOneBlock(CIIPCopyBufSz);
; ; ; ; ; ; Dec(TmCt);
; ; ; ; ; End;
; ; ; ; ; If (LastByteS>0) Then
; ; ; ; ; Begin
; ; ; ; ; ; FCopyOneBlock(LastByteS);
; ; ; ; ; End;

; ; ; ; ; // 拷贝结束,释放内存
; ; ; ; ; If (_LClose(sFl)=HFILE_ERROR) Then
; ; ; ; ; ; ;GetLastError;
; ; ; ; ; CloseFile(tFl);
; ; ; ; ; If (IoResult<>0) Then Asm NOP End;
; ; ; ; ; FreeMem(_Buf,CIIPCopyBufSz);
;End;
 
多人接受答案了。
 

Similar threads

回复
0
查看
1K
不得闲
回复
0
查看
866
不得闲
回复
0
查看
701
不得闲
回复
0
查看
818
不得闲
后退
顶部