我已经使用“readdir_r”实现了遍历目录层次结构,当我向函数传递以“/”符号结尾的字符串时,它按预期工作,例如:“./../../”。
但是当我传递类似“./..”的东西时,程序会默默地失败,尽管它应该抛出一个 IOFileAccessException 类型的异常。它发生在这里(调用 stat 失败后)
IOFileAccessException::IOFileAccessException(
const std::string& filename,
const std::string& operation,
int errcode)
: runtime_error("Error on access to file \'" + filename +
"\'. Failed operation: \'" + operation + "\'. Error message: " + strerror(errcode)) {
}
...
// prep dirent struct
long int name_max = pathconf(dir.c_str(), _PC_NAME_MAX);
if (name_max == -1) /* Limit not defined, or error */
name_max = 255; /* Take a guess */
long int len = offsetof(struct dirent, d_name) + name_max + 1;
struct dirent *thedir = static_cast<struct dirent*>(malloc(len));
while (!dirs.empty()) {
...
DIR* d = opendir(currentdir.c_str());
...
struct dirent *result = NULL;
do {
int res = readdir_r(d, thedir, &result);
if (res > 0) { // error processing and throw exception. It does not throw in our case }
struct stat buf;
res = stat(d_name.c_str(), &buf);
if (res == -1) {
int err = errno;
throw IOFileAccessException(d_name, "stat (directory is \'" + currentdir + "\')", err);
}
} while (result != NULL);
...
在单步执行代码时,我发现它在异常构造函数中失败,在调用':runtime_error(...'。
另一件奇怪的事情是,对于输入(起始目录)“./..”,d_name var 的值为“./../throw declaration”,而 result->d_name 的值为“throw declaration”。结果指针指向与dir 指针相同的地址。
对我来说似乎是个谜,希望你能帮我解决它。
我已将孔代码粘贴到此处的 Pastbin中。它不是那么大,我只是认为这样的信息会更干净。
如果需要,您甚至可以使用在线编译器对其进行编译和测试。
对此案的任何建议表示赞赏。谢谢你。