【问题标题】:How to tell if folder is a subfolder for recursive folder copy?如何判断文件夹是否是递归文件夹复制的子文件夹?
【发布时间】:2014-07-28 20:58:14
【问题描述】:

我正在尝试实现一个文件夹复制方法,该方法在循环中调用FindFirstFileFindNextFile,它可能会在任何子文件夹上递归调用自身。

为了防止明显的无限循环,我需要确保目标文件夹不是源文件夹的子文件夹。问题是如何做到这一点?我的想法是将 DOS 路径转换为特定于设备的路径(需要了解如何),但似乎还有更多。

所以我正在针对这种情况进行测试:

我将My Documents 文件夹设置为重定向到\\Server\Home\UserA\Documents 的网络共享,此外,该文件夹还映射到客户端计算机上的驱动器R:。这意味着以下所有文件夹:

"R:\Documents\Subfolder1"
"\\Server\Home\UserA\Documents\Subfolder1"
"C:\Users\UserA\Documents\Subfolder1"

技术上指向相同的物理位置,即My Documents 的子文件夹。

问题是如何可靠地知道这一点?

【问题讨论】:

  • 如果您正在遍历文件夹层次结构,您希望如何遇到映射到同一个文件夹的多个文件夹?除非您使用符号链接或联结(在迭代过程中都可以检测到)。
  • 哦,不用符号链接也可以轻松完成。假设我将c:\Folder1 指定为源文件夹,将c:\Folder1\Folder2 指定为目标。

标签: c++ windows winapi filesystems


【解决方案1】:

使用GetFileInformationByHandle 检索目标目录和每个可能匹配项的卷序列号和文件索引。如果序列号和文件索引相同,则为同一目录。

请注意,您需要在CreateFile 中使用FILE_FLAG_BACKUP_SEMANTICS 标志才能打开目录句柄。 (您不需要备份权限即可。)

克隆的卷可能具有相同的序列号(我不确定 Windows 是否强制更改序列号),因此向用户提供禁用此检查的选项可能是明智的。

【讨论】:

  • 谢谢,这是一个很好的解决方案。尽管我会为最终用户提供什么选择? "[x] 挂断应用程序并在我的磁盘上创建一个巨大的文件夹" :)
  • "[x] 闭嘴,我知道我在做什么" :-) 但是说真的,我的命令行应用程序有一个 /nofileids 选项。另一方面,我是唯一一个使用它的人,所以我不必担心它会被误解......你可以将它隐藏在注册表设置或其他东西中。或者,如果您想在没有用户干预的情况下明确支持此方案,当您检测到可能的递归时,您可以创建一个具有唯一名称的临时文件,并查看它是否显示在“其他卷”上。
  • 哈哈。好一个。我应该像这样添加一个“复活节彩蛋”。但是,严肃地说,我将如何检测失控递归?你知道的,无限循环类型。
  • 在最一般的情况下,我想您可能需要跟踪您复制的每个目录(我想是源目录和目标目录)的卷序列号和文件索引,这样您就可以知道您是否已经已经看过一个。但是根据您处理连接点和符号链接的方式,可能只需要在访问每个源文件夹时检查顶级目标文件夹。
  • 符号链接是具有FILE_ATTRIBUTE_REPARSE_POINT 属性的链接,对。但是junction points 是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 2011-10-01
  • 2011-01-12
  • 1970-01-01
  • 2013-02-03
相关资源
最近更新 更多