如何在DELPHI5.0中拷贝(复制)一个文件?(50分)

  • 主题发起人 主题发起人 光山
  • 开始时间 开始时间

光山

Unregistered / Unconfirmed
GUEST, unregistred user!
如何在DELPHI5.0中拷贝(复制)一个dos文件?
 
王俊、刘周章 <br><br>  Delphi中有关文件操作的函数不少,但唯独没有提供一个文件拷贝函数。出于实际编程的需要,笔者总结了几种在Delphi中进行文件拷贝的方法,这几种方法都在Delphi 3.0、 4.0下通过,有兴趣的读者可以将它们转化成函数以方便调用。<br><br><br>  方法1(强力推荐)<br><br><br>  通过调用Win 95系统外壳来完成,需要在USES子句中添加SHELLAPI单元。这种方法与Win 95下文件拷贝的方式完全一样,也会自动出现“正在拷贝...”的提示。如果目标文件已经存在,函数可以根据操作标志位自动生成多份复件。<br><br>  改变wFunc的值,则可以完成删除、更名、放到回收站等功能。笔者认为这是最好的一种方法。<br><br>  procedure TForm1.Button5Click(Sender: TObject);<br><br>  var<br><br>  F:TShFileOpStruct;<br><br>  begin<br><br>  F.wnd:=Handle;<br><br>  F.wFunc:=FO—COPY; {操作方式}<br><br>  F.pFrom:=′C:/DEMO.DAT′;<br><br>  F.pTo:=′F:/TEST.DAT′;<br><br>  F.fFlags:=FOF—ALLOWUNDO OR FOF—RENAMEONCOLLISION; {操作选项}<br><br>  if ShFileOperation(F)&lt;&gt;0 then<br><br>  ShowMessage(′文件拷贝失败!′);<br><br>  end;<br><br><br>  ?方法2 (推荐使用)<br><br><br>  采用文件流方式,可以直接对文件进行读写。<br><br>  procedure TForm1.Button2Click(Sender: TObject);<br><br>  Var<br><br>   S, T: TFileStream; {文件流}<br><br>   SourceFileName,DestFileName:String;{源文件和目的文件名}<br><br>  Begin<br><br>   S := TFileStream.Create( SourceFileName, fmOpenRead );<br><br>   try<br><br>   T := TFileStream.Create( DestFileName,fmOpenWrite or fmCreate );<br><br>   try<br><br>   T.CopyFrom(S, S.Size ) ;<br><br>  finally<br><br>   T.Free;<br><br>  end;<br><br>   finally<br><br>   S.Free;<br><br>   end; End;<br><br><br>  ?方法3(推荐在做安装盘时使用)<br><br><br>  采用压缩与解压缩单元LZEXPAND,需要在USES子句中添加LZEXPAND单元。<br><br>  procedure TForm1.Button3Click(Sender: TObject);<br><br>  var<br><br>   SourceHandle, DestHandle: Integer; {文件句柄}<br><br>   SourceFileName,DestFileName:String;{源文件和目的文件名}<br><br>   begin<br><br>   {打开文件}<br><br>   SourceFileName:=′C:/DEMO.DAT′;<br><br>   DestFileName:=′F:/TEST.DAT′;<br><br>   SourceHandle := FileOpen(SourceFileName,0);<br><br>   DestHandle := FileCreate(DestFileName);<br><br>   {拷贝}<br><br>   LZCopy(SourceHandle,DestHandle);<br><br>   {关闭文件}<br><br>   FileClose(SourceHandle);<br><br>   FileClose(DestHandle)<br><br>  end;<br><br><br>  ?方法4(推荐使用)<br><br><br>  采用内存流,内存流可直接将文件数据存放到内存中,代码简单,速度很快。<br><br>  procedure TForm1.Button4Click(Sender: TObject);<br><br>  var<br><br>   SourceFileName,DestFileName: String;<br><br>  begin<br><br>   with TMemoryStream.Create do<br><br>   try<br><br>   LoadFromFile(SourceFileName);<br><br>   SaveToFile(DestFileName);<br><br>   finally<br><br>   Free;<br><br>   end; end;<br><br><br>  ?方法5(不常用)<br><br><br>  采用最基本的文件读写,每次读写一个块。但如果源文件是只读属性,本方法不适用,会出现文件存取错误。<br><br>  procedure TForm1.Button1Click(Sender: TObject);<br><br>  var<br><br>   SourceF,DestoF: File; {文件变量}<br><br>   NumRead, NumWritten: Integer;{读写字节数}<br><br>   Buf: array[1..2048] of Char; {缓冲区大小}<br><br>   SourceFileName,DestFileName:String;{源文件和目的文件名}<br><br>  begin<br><br>   SourceFileName:= ′C:/DEMO.DAT′;<br><br>   DestFileName:=′F:/TEST.DAT′;<br><br>   AssignFile(SourceF, SourceFileName);<br><br>   Reset(SourceF, 1); { Record size = 1 }<br><br>   AssignFile(DestF, DestFileName); { Open output file }<br><br>   Rewrite(DestF, 1); { Record size = 1 }<br><br>   repeat<br><br>   BlockRead(SourceF, Buf, SizeOf(Buf), NumRead);<br><br>   BlockWrite(DestF, Buf, NumRead, NumWritten);<br><br>   until (NumRead = 0) or (NumWritten &lt;&gt; NumRead);<br><br>   CloseFile(SourceF);<br><br>   CloseFile(DestF);<br><br>  end;<br><br> 
 
接受答案了.
 
后退
顶部