c++ - 如何判断文件夹是否是递归文件夹复制的子文件夹?

标签 c++ windows winapi filesystems

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

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

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

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

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

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

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

最佳答案

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

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

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

关于c++ - 如何判断文件夹是否是递归文件夹复制的子文件夹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24101311/

相关文章:

c++ - 用一个微不足道的 forall 得到未知的结果

c++ - DeviceContext (HDC) 中的 Alpha channel

python - IE8 自动化和 https

c++ - 我怎样才能知道我的源代码的编译日期?

c++ - 在 C++ 中使用共享内存的远程代理

c++ - 是否有任何C++函数对哈希表进行排序?

asp.net - Windows Azure : How to 301 non-www url to www for a domain

windows - 如何仅使用 Windows 命令 shell 查找文件大小?

c++ - 显示对话框时如何防止 GetOpenFileName 更改当前目录?

delphi - Delphi中GetLastError和FormatMessage的正确用法是什么?