0

我已经使用“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中。它不是那么大,我只是认为这样的信息会更干净。

如果需要,您甚至可以使用在线编译器对其进行编译和测试

对此案的任何建议表示赞赏。谢谢你。

4

1 回答 1

0

在您的代码中

string d_name = currentdir + result->d_name;

当你传递"./.."给程序时,d_name会像"./..xxx",因此stat失败。

你应该确保currentdir以斜线结尾,你可以使用

if (!currentdir.empty() && 
    *currentdir.rbegin() != '/')
{
    currentdir += '/';
}
于 2014-01-26T15:04:41.057 回答