那个WINAPI函数能够拷贝文件?(0分)

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

RobustMaple

Unregistered / Unconfirmed
GUEST, unregistred user!
那个WINAPI函数能够实行拷贝文件,而且能够换成别的文件名。Help!
 
1.SHFileOperation() &nbsp; //-- Winapi<br>2.TFileSteam : LoadFrom, CopyFrom.<br>3.TMemoryStream: LoadFrom ,saveto<br>3.fopen(),fread();fWrite();<br>4.FileCreate,FIleOpen,FileWrite<br>5.LZCopy().FileOpen,FileCreate.//-- Winapi<br>
 
自己写一个吧<br>procedure Filecopy(sourcefilename,targetfilename:string);<br>Var<br>&nbsp; &nbsp;S,T: TFileStream;<br>Begin<br>&nbsp; &nbsp;S:=TFileStream.Create( sourcefilename, fmOpenRead );<br>&nbsp; &nbsp;try<br>&nbsp; &nbsp; &nbsp;T:=TFileStream.Create( targetfilename, fmOpenWrite or fmCreate );<br>&nbsp; &nbsp; &nbsp;try<br>&nbsp; &nbsp; &nbsp; &nbsp; T.CopyFrom(S, S.Size ) ;<br>&nbsp; &nbsp; &nbsp;finally<br>&nbsp; &nbsp; &nbsp; &nbsp; T.Free;<br>&nbsp; &nbsp; &nbsp;end;<br>&nbsp; &nbsp;finally<br>  &nbsp; S.Free;<br>&nbsp; &nbsp;end;<br>End;<br>&nbsp;
 
请看此文::<br>充分利用Windows API扩展Delphi函数 <br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 袁卫国 <br><br>&nbsp;<br>  Borland Delphi是与Visual Basic相似的可视化开发工具,但其功能比VB更加强大。如,Delphi支持汇编语言和指针操作、全面支持Windows API函数及外部DLL的使,使得它具有更广泛的应用范围。即使用于编制一些较小的应用程序,Delphi与VB比看来不相上下, 但由于Delphi是编译型的语言,其编译后的EXE文件可以真正脱Delphi的环境独立运行,而VB 生成的EXE文件离开了VB软件包的一大堆DLL、 VBX等文件可能会无法执行。而更重要的是,一般用户往往并不真正知道自己开发VB程序到底使用了哪些DLL一类的文件,为了保证程序的正常运行,可能在最后的装盘中包含了不少其实并不需要的文件。所以,一般用户用VB很难开发出真正实的软件,难怪有人说VB是"先甜后苦"。Delphi实际上可以看作是VP(Visual Pascal),所以它的易学性也可与VB媲美。今年发布的Delphi2.0可以为Windows 95、Window s NT开发32位程序,使得VB 4.0的优势也不复存在。看来,在今后一段时间内,将会有更多<br>的人使用Delphi开发Windows应用程序。在DOS下开发过软件的人都知道int 2lh的重要。与此类似,Windows应用程序也是离不开Windows API的,许多较底层的操作必须通过API函数来实现。为此,无论是C++、VB还是Delphi都无一例外地支持API函数的调用,只是VB由于自身的特点所限制,仅支持部分API函数,而C++、Delphi则全面地支持API函数。相比之下,Delphi对API函数的调用最简捷,达到了与自身的内部函数几乎不分彼此的程度(只要求在interfaces中的user段中加上Windows即可,而这一步Delphi会自动为您做到),VB则相当繁琐。以调用获得Windows系统子目录的API函数为例,我们来看一下二者有什么不同:<br><br>  API函数格式的描述:WORD GetSystemDirectory(lpBuffer, nSize)<br>  VB 4.0调用时首先要做如下申明:<br>  Declare Function GetSystemDirectory Lib"kernel32"(ByVal<br>       lpBuffer As String, ByValnSize As Long)As Long <br>  然后才能使用: <br>  Dim lpBuffer As String *255 <br>  Size&amp;=GetSystemDirectory(lpBuffer,255) <br>  而Delphi只需像调用内部函数那样: <br>    var<br>      lpBuffer:PChar;{API函数必须使用null结尾的字符串} <br>      Size:WORD;{返回的系统子目录字符串实际长度} <br>    begin<br>      lpBuffer:=StrAlloc(255);{预留字符串长度} <br>      Size:=GetSystemDirectory(lpBuffer,255);<br>     end; <br>  由此可见,Delphi是可以充分利用Windows API来扩展其自身功能的。当然,在大多数情况下,Delphi本身的函数功能已经足够使用了。但是,在有些情况下,需要使用API函数来实现一些特殊的功能或完善Delphi的一些功能。下面提供两个实例来说明这一点。 <br><br><br>一、信息框函数MsgBox <br>  信息框是Windows应用程序中使用得较多的一种对话机制,它被广泛地用于提示、选择程序走向,是一个重要的程序控制手段。Delphi提供的信息框函数MessageDlg功能比较强,其最大优点是可以任意设定信息框的按钮(使用了集合类型),但其缺点也是很明显的,主要表现在标题字符串不能由用户自己设置;窗口弹出时寂静无声;按钮不能随着Windows的不同语言的版本显示不同的文字(例如无论在哪种语言版本下都只能显示"OK"、"Yes"等英文字符)。这些优点和缺点都是由于它是Delphi自己实现的,而不是通过调用系统API函数实现的,故不能使用系统的语言环境、多媒体等资源。这样,所开发的程序在中文版中显示信息框时与周围的窗口显得极不协调。而VB在这方面却做得较好,所以我们按照VB的格式自定义一个信息框函数MsgBox。下面的函数都假定是在TForml中定义的。为了使用方便,我们首先在Interfaces段中定义一些符号常量: <br><br>const <br>  {第一组:按钮内容选择} <br>OKOnly=0;  {仅显示"确定"按钮} <br>OKCancel=1;  {显示"确定"和"取消"按钮} <br>AbortRetryIgnore=2;  {"中止""重试""放弃"} <br>YesNoCancel=3;  {"是""否""取消"} <br>YesNo=4;  {"是"和"否"} <br>RetryCancel=5;  {"重试""取消"} <br>  {  第二组:显示图标选择} <br>Critical=16;  {"STOP"图标} <br>Question=32;  {"?"图标} <br>Excalamation=48;  {"!"图标} <br>Information=64;  {"i"图标} <br>  {第三组:缺省指针位置(激活状态)} <br>DefaultButton1=0;  {第一按钮} <br>DefaultButton2=256  {第二按钮} <br>DefaultButton3=512  {第三按钮} <br>  {第四组:信息框方式} <br>ApplicationModal=0;  {应用方式} <br>SystemModal=4096;  {系统方式} &nbsp;<br><br><br><br>  然后,建立函数MsgBox,由于API函数中使用的字符串必须以null结尾,所以使用了另一个自定义的函数StrToPch,来将Pascal类型字符串转换成为以null结尾的字符串。<br>  参数说明<br>msg为信息框标题变量; <br>mbType为规定信息框类型的变量,使用方式是"mbType=按钮内容+图标+缺省指针+信息框方式"。便如您想得到一个含"确定"和"取消"两个按钮、带"?"图标、缺省指针指向第二个按钮(即"取消")的信息框,那么就该这样设置:<br>mbType:=OKCancel+Question+DefaultButton2; <br>title为信息框中显示文本的变量。 <br>MsgBox的返回值与MessageDlg函数的返回值完全一样,例如返回mrYes表示"Yes"或<br>"是" 按钮被按下,mrNo表示"No"或"否"按钮被按下等等。可参考MessageDlg函数的说<br>明。下面即是在Delphi中通过调用Windows API的GetActive Windows函数和MessageBox<br>函数来实现MsgBox函数的代码:{信息框函数}<br><br>function TForm1.MsgBox(msg:string;mbType:Word;title:string):Word; <br>var<br> hWnd:HWND; <br> 1pText,!pCaption:Pchar; <br>begin <br> 1pText:=StrToPch(title); <br> 1pCaption=StrToPch(msg); <br> hWnd:=GetActiveWindow(); <br> MsgBox:=MessageBox(hWnd,1pText,1pCaption,mbType); <br>end; <br><br>{将Pascal字符串转换成null结尾字符串函数} <br>function TForm1.StrToPch(Str:string):PChar; <br>var <br> a:PChar; <br>begin <br> a:=StrAlloc(Length(Str)+1); <br> StrPCopy(a,Str); <br> StrToPch:=a; <br>end; &nbsp;<br><br><br><br><br>   二、文件拷贝函数CopyFDelphi提供了一组比较完整的文件操作函数,用它们可以完几乎全部的文件操作,但恰恰缺少拷贝文件的函数。而文件拷贝的使用应该说是比常用的,因此,笔者利用几个API函数定义了一个功能很强的文件拷贝函数CopyF。<br>   该函数代码如下(请注意:该函数中调用了上述的MsgBox函数): <br><br>{文件拷贝函数} <br>function TForm1.CopyF(var ExistingFileName:string;const<br>       NewFileName:string; var Mode:Integer):Boolean; <br>var <br> EFile,NFile:PChar; <br> CpFlag,FailIfExists:Boolean; <br> msg:string; <br> ErrID,mbType:integer; <br>begin <br> EFile:=StrToPch(ExistingFileName); <br> NFile:=StrToPch(NewFileName); <br> if (Mode=1) or (Mode=3) then FailIfExists:=True <br> else FailIfExists:=False; <br> CpFlag:=CopyFile(EFile,NFile,FailIfExists); <br> if not CpFlag then <br> begin <br>  ErrID:=GetLastError(); <br>  ExistingFileName:=SysErrorMessage(ErrID); <br>  if Mode&lt;2 then <br>  begin <br>   msg:='CopyFile Error!'; <br>   mbType:=OKOnly+Excalamation; <br>   MsgBox(msg,mbType,ExistingFileName); <br>  end; <br>  Mode:=ErrID; <br> end; <br> CopyF:=CpFlag; <br>end; &nbsp;<br><br>   CopyF函数参数说明如下: <br>   若拷贝操作成功,函数CopyF返回True,失败函数CopyF返回False。 <br>   ExistingFileName是字符变量,输入时代表源文件名。若操作失败,则返回错误信息字符串(由于调用了API函数,在中文Windows下该信息当然就是中文)。 <br>   NewFileName是字符常量,代表目标文件名。 <br>   Mode是整数变量,输入时代表拷贝的方式: <br>    0表示如果目标文件存在,将覆盖它,操作失败,将显示具有出错信息的信息框; <br>    1表示如果目标文件存在,不覆盖它,操作失败,显示具有出错信息的信息框; <br>    2表示如果目标文件存在,将覆盖它,操作失败,不显示信息框; <br>    3表示如果目标文件存在,不覆盖它,操作失败,不显示信息框; <br>   当拷贝操作失败时,Mode将返回出错代码。 <br><br> 总之,灵活应用API函数可以使您的应用程序的界面与您使用的Windows的语言环境相当和谐地融为一体,摆脱掉Delphi的痕迹,使您的程序给人以相当"专业"的感觉。最后说明一点,如果要使这些自定义的函数成为"全局"的,在其它单元中也能够使用,需将函数标题复制到Unitl单元interfaces的type段中(应删除"TForml."几个字符);然后在调用函数的其他单元implementation中的user段中加入Unitl;在函数名前要加上"Form1."几个字符,如在Unit2单元中调用MsgBox就应写成Form1.MsgBox。 <br><br>(以上所有函数均在Windows 95中文版使用Delphi Desktop V2.0调试通过) <br>------------------------------------------------------------------------------<br><br>实际使用中本人采用了如下的方法: <br><br>unit UnitFunction;<br><br>interface<br>uses Windows, SysUtils;<br>const<br>&nbsp; {第一组:按钮内容选择}<br>&nbsp; OKOnly=0; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{仅显示"确定"按钮}<br>&nbsp; OKCancel=1; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{显示"确定"和"取消"按钮}<br>&nbsp; AbortRetryIgnore=2; &nbsp;{"中止""重试""放弃"}<br>&nbsp; YesNoCancel=3; &nbsp; &nbsp; &nbsp; {"是""否""取消"}<br>&nbsp; YesNo=4; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {"是"和"否"}<br>&nbsp; RetryCancel=5; &nbsp; &nbsp; &nbsp; {"重试""取消"}<br>&nbsp; {第二组:显示图标选择}<br>&nbsp; Critical=16; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{"STOP"图标}<br>&nbsp; Question=32; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{"?"图标}<br>&nbsp; Excalamation=48; &nbsp; &nbsp; &nbsp;{"!"图标}<br>&nbsp; Information=64; &nbsp; &nbsp; &nbsp; &nbsp;{"i"图标}<br>&nbsp; {第三组:缺省指针位置(激活状态)}<br>&nbsp; DefaultButton1=0; &nbsp; &nbsp; {第一按钮}<br>&nbsp; DefaultButton2=256; &nbsp; {第二按钮}<br>&nbsp; DefaultButton3=512; &nbsp; {第三按钮}<br>&nbsp; {第四组:信息框方式}<br>&nbsp; ApplicationModal=0; &nbsp; &nbsp;{应用方式}<br>&nbsp; SystemModal=4096; &nbsp; &nbsp;{系统方式}<br>&nbsp; function StrToPch(Str:string):PChar;<br>&nbsp; function MsgBox(msg:string;mbType:Word;title:string):Word;<br><br>implementation<br><br>function MsgBox(msg:string;mbType:Word;title:string):Word;<br>var<br>&nbsp; hWnd1: &nbsp;HWND;<br>&nbsp; lpText,lpCaption: Pchar;<br>begin<br>&nbsp; lpText:=StrToPch(title);<br>&nbsp; lpCaption:=StrToPch(msg);<br>&nbsp; hWnd1:=GetActiveWindow();<br>&nbsp; MsgBox:=MessageBox(hWnd1,lpText,lpCaption,mbType);<br>end;<br><br>{将Pascal字符串转换成null结尾字符串函数}<br>function StrToPch(Str:string):PChar;<br>var<br>&nbsp; a:PChar;<br>begin<br>&nbsp; a:=StrAlloc(Length(Str)+1);<br>&nbsp; StrPCopy(a,Str);<br>&nbsp; StrToPch:=a;<br>end;<br>end.<br>&nbsp;<br>&nbsp;<br>
 
<br>&nbsp;是简单的当然是Windows API函数:<br>&nbsp;BOOL CopyFile(LPCTSTR lpExistingFileName,<br>&nbsp; LPCTSTR lpNewFileName,<br>&nbsp; BOOL bFailIfExists<br>&nbsp;);<br>&nbsp;如果不是要求太高干嘛要自己做那么多的工作?<br>
 
接受答案了.
 
x:=CopyFile('C:/MyStuff/temp.txt', 'C:/Junk/buffer.txt')<br>If x = 0 Then<br>&nbsp; showmessage('failure')<br>else showmessage('sucess')<br>
 
后退
顶部