王俊、刘周章 <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)<>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 <> NumRead);<br><br> CloseFile(SourceF);<br><br> CloseFile(DestF);<br><br> end;<br><br>