CopyFile函数仅适用于xp

时间:2015-08-05 13:26:53

标签: file delphi operating-system 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;

按钮的点击事件:

CopyAFile(fn, Path +'\'+ ExtractFileName(fn));

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

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

我没有得到任何错误,我已经逐步完成了代码,这很顺利。

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

1 个答案:

答案 0 :(得分:7)

您没有进行任何错误检查 如果CopyFile函数失败,则返回值为零。要获取扩展错误信息,请致电GetLastError(或通过RaiseLastOSError提出异常)

e.g。

if not CopyFile(A, B, False) then
  RaiseLastOSError;

或等效

Win32Check(CopyFile(A, B, False));
顺便说一下,正确的用法是:

CopyFile(PChar(Sourcefile) , PChar(Destfile), False);

无需额外分配。

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