如何获取具有其中一个路径的文件或目录的真实完整路径?

How to get real full path of a file or directory having one of its paths?

同一个文件系统条目可以在多个路径中访问。

  1. 真实完整路径 - /home/user/dir1/file1
  2. 包含 parent 目录的路径 - /home/user/dir1/../dir1/file1
  3. 带直接符号链接的路径 - /home/user/dir1/symlink_to_file1
  4. 带间接符号链接的路径 - /home/user/symlink_to_dir1/file1
  5. ...

我想写一个函数,对于给定的两个路径,判断第二个路径指定的文件或目录是否在(包括sub-directories)第一个路径指定的目录中。

我认为最明显的解决方案是找到两个文件系统条目的真实完整路径,然后检查第一个真实路径是否是第二个真实路径的前缀。这就是为什么问题的标题是关于找到 真正的完整路径 .

注意:我想为 Windows 和 POSIX 兼容系统编写函数。

注意:boost::filesystem 无法使用。

在 Windows 和 Unix 领域都一样, 没有单一的“真实路径”。特别是一个文件可以有许多不同的目录条目,称为硬链接,在 Unix-land 中通过 ln 创建,在 Windows 7 和更高版本中通过 mklink 创建。而且,在 Windows 中,您可以通过 subst 命令非常简单地定义映射到某个目录的本地逻辑驱动器,并通过例如映射到文件服务器目录的驱动器。 net use,您可以将驱动器挂载为目录,例如通过 mountvol 命令。

然而,“真实路径”问题只是对真实问题的想象解决方案,即确定文件或目录是否在通过路径指定的目录中。

为此,为您正在搜索的文件系统实体建立一个系统特定的 ID,并扫描父目录链以查找该 ID。抱歉,我误读了问题。我想不出任何有效的方法来执行此操作,这听起来像是在所有可能的目录中进行强力 ID 搜索,除非您可以利用索引信息。

您需要预先知道的问题是:有多少种方法可以到达 /path/to/filename?使用符号 links 答案是无限的(好吧,在文件系统大小的范围内)。文件系统任何部分任何位置的任何符号 link 都可以重定向到文件(或文件上方路径的某些部分)。即使不考虑 hard links,搜索 space 也必须是 /base/path/of/interest/ 下的整个文件系统(可能是整个文件系统)。

允许符号 links,并且没有进一步的限制,没有非暴力方法来确定 /path/to/filename 是否可以在 /base/path/of/interest/.