【问题标题】:How to clone a file?如何克隆文件?
【发布时间】:2014-08-06 10:06:44
【问题描述】:

我想制作一个文件的相同副本,并且我知道如何将文件的内容复制到新文件中,但我不知道如何复制属性和日期。

我尝试了以下代码,但它在 Delphi 2009 中不起作用:

SrcHandle:=CreateFile(PWideChar('\\?\'+SrcName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0);
DestHandle:=CreateFile(PWideChar('\\?\'+DestName), GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, SrcHandle);

注意目标CreateFile的最后一个参数是源文件的句柄。 Delphi 说如果我这样做,它会将“属性和扩展属性”复制到新文件中。但它没有......

【问题讨论】:

  • TFile.Copy 有什么问题?
  • @DavidHeffernan 我认为 marus nebunu 想要“克隆”(如 创建一个包含时间戳和属性的相同副本) 一步中的文件。我不知道他为什么想要它,但文档承诺会为他做这件事,但事实并非如此。 TFile.Copy() 是否复制属性和时间戳? (我真的不知道,但我认为它不知道。)
  • 复制属性。文件戳需要单独完成。为什么要使用 CreateFile。
  • 我怀疑该 API 甚至没有在该调用中引用“SrcHandle”,因为您可以毫无问题地传递无效句柄。

标签: file delphi winapi copy delphi-2009


【解决方案1】:

使用IOUtils 中的TFile.Copy()。操作系统提供文件复制功能,此功能利用了这些功能。此函数调用 Windows CopyFile 函数。如果您愿意,可以直接调用它。

以这种方式复制文件后,所有属性都将被复制。最后一步是文件时间戳。使用GetFileTimeSetFileTime 执行此步骤。

【讨论】:

  • +1 这是要走的路。然而,为什么hTemplateFile 没有像CreateFile api 中记录的那样运行仍然是个谜。
【解决方案2】:

只需手动设置文件属性 - SetFileAttributes function

【讨论】:

猜你喜欢
  • 2012-03-28
  • 2018-06-05
  • 2016-04-02
  • 1970-01-01
  • 2023-04-09
  • 2015-12-13
  • 2019-01-05
  • 2018-07-15
  • 2014-12-21
相关资源
最近更新 更多