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

时间:2015-06-04 17:16:04

标签: c++ error-handling realpath

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

我正在使用auto来"规范化"文件路径。我向$objPHPExcel->setActiveSheetIndex(2); $worksheet = $objPHPExcel->getActiveSheet(); 提供的每个目录和文件的路径肯定存在,这当然对于realpath()正常工作至关重要。

但是,有时realpath()将失败,错误代码为17,名称为realpath(),字符串描述为"文件存在"。

令我感到困惑。当然它存在,我在realpath()尖叫。但EEXIST对我的咆哮毫无动摇。

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

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

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

  • 目录的绝对路径:realpath()
  • 文件的绝对路径:EEXIST
  • 文件的相对路径:/alpha/bravo/charlie/delta
  • 指向其中包含额外点的文件的路径:/alpha/bravo/charlie/foo.txt

但是这些例子并不是确定的,因为具有完全相同模式的其他文件在同一目录中会成功。

对于哪个目录或文件导致../../charlie/foo.txt错误,似乎没有任何押韵或理由。该错误通常仅发生在我尝试规范化的第一个文件路径上,然后不适用于后续文件路径。但是,我不能仅仅通过尝试再次规范化第一个文件来克服它;错误将继续发生。

计划摘要:

/alpha/bravo/Charlie/./foo.txt

2 个答案:

答案 0 :(得分:5)

你永远不应该在没有特定原因的情况下检查errno

也许上次发生的任何内部操作realpath都失败了EEXIST。或者errno恰好是EEXIST来自之前失败且realpath没有改变的操作。

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

从您自己的链接:

  

成功完成后,realpath()将返回指向已解析名称的指针。 否则,realpath()将返回一个空指针并设置errno以指示错误,并且resolve_name指向的缓冲区的内容未定义。

请注意,如果errno成功,则不会将realpath设置为任何内容。那么为什么在检查errno是否成功之前检查realpath

答案 1 :(得分:-1)

也就是说,您不应该通过检查'errno'值来认为realpath()失败/成功,您应该对照NULL检查其返回值。如果返回NULL,则可以检查“ errno”以找出根本原因。 换句话说,如果realpath()成功,则它可能不会更改/重置/清除“ errno”值-为其分配0。仅当失败时,它才会将“ errno”设置为错误代码。

相关问题