Mik*_*nch 3 c++ error-handling realpath
我的程序在Linux环境中运行,使用gcc 4.4.7版编译.
我正在使用realpath()
"规范化"文件路径.我提供的每个目录和文件的路径realpath()
肯定存在,这当然对于realpath()
正常工作至关重要.
但是,有时realpath()
会失败,错误代码为17,名称EEXIST
,字符串描述"文件存在".
那令我困惑.当然它存在,我尖叫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;
}
Run Code Online (Sandbox Code Playgroud)
你永远errno
不应该在没有特定原因的情况下进行检查.
也许realpath
上次发生的任何内部操作都失败了EEXIST
.或者可能errno
碰巧EEXIST
来自之前的一些操作失败并realpath
没有改变它.
如果这不会导致realpath
失败,你为什么关心?
从您自己的链接:
成功完成后,realpath()将返回指向已解析名称的指针.否则,realpath()将返回空指针并设置errno以指示错误,并且resolve_name指向的缓冲区的内容未定义.
请注意,errno
如果realpath
成功,则不会将其设置为任何特定内容.那么为什么errno
在检查是否realpath
成功之前检查?
归档时间: |
|
查看次数: |
726 次 |
最近记录: |