以编程方式复制文件夹而不解析Windows中的硬链接(Win32 API)

时间:2011-09-14 17:03:06

标签: windows hardlink

我想在不解析硬链接的情况下复制整个文件夹

示例:

Folder1
  |
  +---File1
      File2
      HardLink3 -> File3

(使用fsutil hardlink createmklink创建的HardLink3)

我想将此文件夹复制到

Folder2
  |
  +---File1
      File2
      HardLink3 -> File3

将Folder2 \ HardLink3保留为指向File3的硬链接

是否有Win32 API调用来复制整个文件夹 这个语义,或者,如果我需要做CopyFile / CreateHardLink 逐个文件,检查给定文件是什么的API调用 是否有硬链接?

2 个答案:

答案 0 :(得分:2)

我认为没有Win32 API调用可以一次性完成您想要的操作,因此您可能需要手动执行此操作。

检查文件是否是硬链接可能不是您想要做的。如果文件不是符号链接,目录(或重新分析点或其他一些模糊的东西),它实际上是一个硬链接,即文件名指向磁盘上存储的文件。因此,如果两个文件指向相同的数据,则它们都是该文件的硬链接。

无论如何,枚举文件所有硬链接的Win32方法是FindFirstFileNameW和FindNextFileNameW。

答案 1 :(得分:2)

如果您完全确定这是您想要做的,确定文件是否有多个链接(即“是一个硬链接”)的最简单方法可能是GetFileInformationByHandle

对于普通文件,返回的nNumberOfLinks值将为1;如果文件是(或具有)硬链接,则返回的值大于1。

如果我已正确理解您的场景,那么检查文件是否与某个特定文件集(“共享文件夹”中的文件)之间的硬链接可能更为明智,而不是它是否是硬链接任何地方的任何文件。要执行此操作,请查看文件ID(nFileIndexHighnFileIndexLow),其中硬链接与原始文件相同。

在后一种情况下,作为优化,您可以使用GetFileInformationByHandleExFileIdBothDirectoryInfo选项在单个操作中读取给定目录中所有文件的名称和文件ID。