我的程序在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
答案 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”设置为错误代码。