【问题标题】:How to get real full path of a file or directory having one of its paths?如何获得具有其路径之一的文件或目录的真实完整路径?
【发布时间】:2015-02-27 15:46:37
【问题描述】:

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

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

我想要两个编写一个函数,对于给定的两个路径,它将判断第二个路径指定的文件或目录是否在第一个路径指定的目录内(包括子目录)。

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

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

注意:boost::filesystem 不能使用。

【问题讨论】:

  • 你考虑过硬链接吗?我认为在 Linux 中目录(或文件)只有一个“真实名称”的想法是没有意义的。
  • 它在 Windows 中也没有什么意义。但是,在典型的 Windows 安装中,没有包含多个目录条目(硬链接)的文件。

标签: c++ c path cross-platform


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答。非常遗憾的是,没有单一的“真正的道路”。您建议的解决方案对我来说并不方便,因为它非常耗时(考虑到也应该在子目录中进行查找)。
【解决方案2】:

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

允许符号链接,并且没有进一步的限制,没有非暴力方法来确定 /path/to/filename 在 /base/path/of/interest/ 中是否可访问。

【讨论】:

    猜你喜欢
    • 2013-07-20
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 2011-03-26
    相关资源
    最近更新 更多