Realpath需要文件存在

时间:2015-03-29 15:37:27

标签: c linux unix path

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

我写这个主题的原因是:realpath设置errno访问被拒绝。如果此路径的一部分是某个目录的子路径,我想创建一个文件,因此在调用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'

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

但这不是一个很好的解决方案,因为我创建了目录而且我不知道如果结果不是路径的孩子会怎么做。只需删除所有创建的目录?

1 个答案:

答案 0 :(得分:1)

我说" 访问被拒绝" (EACCES)并不表示缺少文件(ENOENT),但对路径或部分路径的访问权限不足。

来自man realpath

  

<强>错误

     

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

     

[...]

     

ENOENT 指定的文件不存在。


回答你的问题:

  

在Linux / Unix / C中是否有一个等效的实际路径,它没有检查文件是否存在?

没有

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