【问题标题】:CopyFile function only works on xpCopyFile 功能仅适用于 xp
【发布时间】:2015-10-28 07:29:04
【问题描述】:

我有一个带有按钮的 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)上运行此表单时,它不会复制文件,再次检查目录我看不到文件。

我没有收到任何错误,我已经逐步完成了正常运行的代码。

有没有人遇到过这种情况或知道原因可能是什么?如果是这样,任何帮助都会很棒。

【问题讨论】:

  • 你有写入目标目录的权限吗?
  • 您是复制到程序文件目录还是任何其他系统目录?也许您的文件被复制到虚拟商店。
  • 我已经检查了权限,在那里看不到任何问题。我已经尝试了多个目录,但仍然没有运气
  • @Dag 你使用WinAPI.Windows.CopyFile ir 是你的CopyFile 方法自定义吗?
  • CopyFile 在所有版本的 Windows 上都能正常工作。您的问题是您没有目标目录的写权限。因为UAC。这是10年前推出的。 “我没有收到任何错误”。你没有检查错误,所以你怎么知道没有错误。请阅读CopyFile 的文档。它将失败并且GetLastError 将返回ERROR_ACCESS_DENIED。或者您的应用程序已虚拟化,CopyFile 成功但写入虚拟商店。

标签: file delphi operating-system delphi-xe2


【解决方案1】:

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

例如

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.

【讨论】:

  • 使用 Win32Check 我得到系统错误代码 2 系统找不到指定的文件。
  • @Dag,这回答了你的“知道原因可能是什么吗?”你提供的文件名不存在。
  • 如果该文件不存在,那么当我浏览并选择它时肯定看不到它吗?
  • 系统是对的。该文件不存在。大概是文件系统重定向器。您从 system32 复制文件,但该文件被重定向到 syswow64。要是你展示了一个 mcve 就好了。
猜你喜欢
  • 2022-01-16
  • 2011-12-16
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多