【问题标题】:Realpath requires file existRealpath 需要文件存在
【发布时间】:2015-06-02 13:50:33
【问题描述】:

我想检查一个路径是否是另一个路径的子路径,所以我调用realpath(file_path, NULL) 并将结果与​​strncmp 进行比较。

我写这个主题的原因是:realpatherrno 设置为拒绝访问。如果此路径的一部分是某个目录的子路径,我想创建一个文件,因此在调用 realpath 之前该文件不能存在。

在 Linux/Unix/C 中是否有 realpath 等效项,它不检查文件是否存在?它也不能跟随符号链接。


Material from comment:

假设我有目录“/tmp/tao-client-aaaaaa/classes/”,我只想创建(一个文件)“/tmp/tao-client-aaaaaa/classes/parent/parent generating test”,因为应用程序(服务器)要求创建“/parent/parent generating test”。问题是我无法创建名为“parent”的目录,因为它可能是“..”,realpath 将返回错误,而我测试文件,该文件将在不存在的目录中创建。

我想,我可以自己实现realpath,但我听说Unicode有很多字符或字符连接意味着父目录。

Material from 'answer':

我有想法。我可以创建添加到路径下一个目录的函数,使用realpathrealpath 的测试结果是参数的子目录(称为路径)。接下来,如果条件不通过,则返回 null;如果条件通过,则返回 realpath 结果。 Wrapper 将创建该目录并从路径获取下一个目录以保存文件并以这种方式将其传递给此函数result_path = test_real_path(result_path, next_directory)

但这不是很好的解决方案,因为我创建了目录并且我不知道如果结果不是路径的子节点该怎么办。只删除所有创建的目录?

【问题讨论】:

  • 你能澄清你的最后一句话吗?您的意思是“它不必清理路径中的符号链接”吗?我认为如果你举一个你正在尝试做的例子会很有帮助。
  • 我不希望函数/过程因安全问题而遵循符号链接,但这不是我的程序运行所必需的。它不应从文件系统中删除符号链接,但应在找到符号链接后生成错误。
  • 没有标准函数会在遇到符号链接时出错。我有类似于realpath() 的代码,它检查所有符号链接和符号链接中组件的安全性——它可以适应在遇到符号链接时给出错误。但它是一段不平凡的代码,大约有 1000 行代码加上测试材料等。它会检查你可能不需要,也不会做一些你绝对需要它做的事情,但那是因为它在生活中有不同的使命。
  • 如果您给出一个包含 2-4 条路径的示例以及在这些示例中使用时希望从函数中获得的结果,它仍然会有所帮助。因为我还不清楚你真正追求的是什么——双重不是因为你说你不想跟随符号链接,但realpath() 的目的是解析符号链接。
  • 假设我有目录“/tmp/tao-client-aaaaaa/classes/”,我只想创建“/tmp/tao-client-aaaaaa/classes/parent/parent 生成测试”,因为应用程序(服务器)要求创建“/父/父生成测试”。问题是我无法创建名为“parent”的目录,因为它可能是“..”,而 realpath 将返回错误,而我测试文件,该文件将在不存在的目录中创建。

标签: c linux unix path


【解决方案1】:

我会说“访问被拒绝”(EACCES)并不表示文件丢失(ENOENT),而是对路径或其部分的访问权限不足。

来自man realpath

错误

EACCES 路径前缀组件的读取或搜索权限被拒绝。

[...]

ENOENT指定的文件不存在。


回答你的问题:

在 Linux/Unix/C 中是否有一个等效的 realpath,它不检查文件是否存在?

没有。

但这对于您的用例来说不是必需的。只需使用. 而不是您要创建的文件名。

【讨论】:

  • 感谢您的回复。错误是我在没有所需权限的情况下创建了目录,并且文件应该属于该目录。但是还是有问题:当我测试路径不存在时,文件的父文件夹也不存在,出现错误“不是这样的文件或目录”。
猜你喜欢
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
  • 2012-08-18
  • 2023-04-10
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多