gpt4 book ai didi

c++ - 为什么 realpath() 返回错误 EEXIST?

转载 作者:太空狗 更新时间:2023-10-29 20:38:43 25 4
gpt4 key购买 nike

我的程序运行在Linux环境下,用gcc 4.4.7版本编译。

我正在使用 realpath() 来“规范化”文件路径。我提供给 realpath() 的每个目录和文件的路径肯定存在,这当然是 realpath() 正常工作所必需的。

但是,有时 realpath() 会失败,错误代码为 17,名称为 EEXIST,字符串描述为“File exists”。

这让我很困惑。它当然存在,我对 realpath() 尖叫。但是 realpath() 对我的咆哮不为所动。

realpath() 的文档在 http://pubs.opengroup.org/onlinepubs/009695399/functions/realpath.html列出了导致它失败的错误,但 EEXIST 不是其中之一。

为什么 realpath() 会以这种方式失败?

导致 EEXIST 错误的目录和文件路径示例:

  • 目录的绝对路径:/alpha/bravo/charlie/delta
  • 文件的绝对路径:/alpha/bravo/charlie/foo.txt
  • 文件的相对路径:../../charlie/foo.txt
  • 文件路径中有一个额外的点:/alpha/bravo/Charlie/./foo.txt

但这些示例不是确定的,因为具有完全相同模式且位于相同目录中的其他文件将成功。

对于哪个目录或文件会导致 EEXIST 错误似乎没有任何韵律或原因。该错误通常只发生在我尝试规范化的第一个文件路径上,而不会发生在后续文件路径上。但是,我不能仅仅通过尝试再次规范化第一个文件来绕过它;错误将继续发生。

程序片段:

#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h> // for PATH_MAX

using std;

string PathCanonicalize( string const & path )
{
string result;

char szResult[ PATH_MAX ];
::realpath( path.c_str(), szResult );
if ( errno == EEXIST )
{
// Why?
cerr << "realpath: error code " << errno << ", " << ::strerror( errno ) << ": '" << path << "'. Of course the file exists!" << endl;

result = path;
}
else if ( errno )
{
cerr << "realpath: error code " << errno << ", " << ::strerror( errno ) << ": '" << path << "'" << endl;

result = path;
}
else
{
result = szResult;
}

return result;
}

最佳答案

如果没有特定原因,您永远不应该检查 errno

也许上次 realpath 发生的任何内部操作都因 EEXIST 而失败。或者可能 errno 恰好是 EEXIST 来自之前一些失败的操作并且 realpath 没有改变它。

如果这不会导致 realpath 失败,您为什么要关心?

来自您自己的链接:

Upon successful completion, realpath() shall return a pointer to the resolved name. Otherwise, realpath() shall return a null pointer and set errno to indicate the error, and the contents of the buffer pointed to by resolved_name are undefined.

请注意,如果 realpath 成功,它并没有说 errno 被设置为任何特别的值。那么,为什么要在检查 realpath 是否成功之前检查 errno

关于c++ - 为什么 realpath() 返回错误 EEXIST?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30650180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com