CopyFile函数仅适用于xp

Sha*_*pie -2 delphi operating-system file delphi-xe2

我有一个带有按钮的delphi表单.单击此按钮,它允许用户浏览文件并将文件复制到目录.

我的功能代码是这样的:

function TdmData.CopyAFile(Const Sourcefile, DestFile: string): boolean;
var Src, Dest : PChar;
begin
  Src := StrAlloc(Length(SourceFile)+1);
  Dest := StrAlloc(Length(DestFile)+1);
try
  StrPCopy(Src,SourceFile);
  StrPCopy(Dest,DestFile);
  result := (CopyFile(Src,Dest,FALSE));
finally
  StrDispose(Src);
  StrDispose(Dest);
end;
end;
Run Code Online (Sandbox Code Playgroud)

按钮的单击事件:

CopyAFile(fn, Path +'\'+ ExtractFileName(fn));
Run Code Online (Sandbox Code Playgroud)

当我运行这个表单并按下win XP机器上的按钮时,我无法理解,它工作正常,如果我浏览到它被复制到的目录,我可以在那里看到该文件.

但是,在以后的操作系统(如Win 8.1)上运行此表单时,它不会复制文件,再次检查目录,我看不到其中的文件.

我没有得到任何错误,我已经完成了通过罚款的代码.

有没有人遇到过这个或者知道原因是什么?如果有的话,任何帮助都会很棒.

kob*_*bik 7

您没有进行任何错误检查.
如果CopyFile函数失败,则返回值为零.获取扩展错误信息调用GetLastError(或通过引发异常RaiseLastOSError)

例如

if not CopyFile(A, B, False) then
  RaiseLastOSError;
Run Code Online (Sandbox Code Playgroud)

或者等价的

Win32Check(CopyFile(A, B, False));
Run Code Online (Sandbox Code Playgroud)

顺便说一句,正确的用法是:

CopyFile(PChar(Sourcefile) , PChar(Destfile), False);
Run Code Online (Sandbox Code Playgroud)

无需额外分配.


如果您不包含UAC清单,那么您的应用程序将以虚拟化模式运行.并且将文件保存到受限区域,例如,Program Files不会引发任何错误,但实际上将文件保存到虚拟商店位置,例如[CSIDL_LOCAL_APPDATA]\VirtualStore\Program Files.