0

我需要建立一个文件的路径。我有以下类方法:

void Directory::scanDirectory(char *directory) {
    DIR *dirp;
    struct dirent *entry;
    char path[1];

    if(dirp = opendir(directory)) {
        while(entry = readdir(dirp)) {
            if (entry->d_name[0] != '.') {
                strcpy(path, directory);
                strcat(path, "/");
                strcat(path, entry->d_name);
                if (entry->d_type == 8) {
                    // Files
                } else if (entry->d_type == 4) {
                    //scanDirectory(path);
                }
                printf("Name: %s, Type: %d\n", entry->d_name, entry->d_type);
            }
        }
        closedir(dirp);
    }
}

我需要通过连接目录和entry->d_name. 当我尝试运行此代码时,它会出现段错误。据我所知,它在我构建路径的地方出现了段错误。有没有更好的方法来做到这一点?

4

5 回答 5

3

您只为路径 ( char path[1]) 分配一个字节。您需要分配足够的空间来实际保存您正在创建的整个路径。给定 C++ 标记,显而易见的可能性是使用std::string,并且在将所有部分放在一起形成完整路径后,使用其c_str()成员函数以 C 样式字符串的形式访问内容。

于 2010-10-09T04:57:09.470 回答
2

为什么不使用Boost.Filesystem

于 2010-10-09T05:07:29.883 回答
1

缓冲区path需要有足够的空间来容纳整个路径。现在它只有一个字符的空间。试着把它变大。strcat 本身不分配空间。您必须手动管理该内存。

至于更好的方法,您可能需要考虑使用string。您无需担心内存,并且可以与+运算符连接。

于 2010-10-09T04:55:48.477 回答
1

更改char path[1];为:

char path[512]; //or whatever value you like.

在您的代码中,路径仅为 1 个字符和\0. 显然你需要一个更大的,据我所知,在 unix 中,目录名称最多可以有 255 个字符,所以我认为 512 就足够了。

于 2010-10-09T04:59:56.333 回答
1

小心使用strcpy。它不进行边界检查,所以即使pathis only char[1],它也会尝试将所有内容复制directory到其中。这可能是你的段错误。

在如何构建字符串方面,您有很多选择。这是关于 C++ 字符串连接效率的长 SO 帖子:

C++ 中的高效字符串连接

如果您使用的是 C++,是否有任何理由不能将内置string库与+运算符一起使用?例如:

string path;
//...
path += directory;
path += "/";
path += entry->d_name;
//etc.

使用string该类的效率可能会稍低一些,但它还有一个额外的好处是可以帮助您避免缓冲区溢出问题和内存异常,例如您遇到的分段错误(我并不是说string会避免所有这些,但它会让你的生活更轻松)。

还有一篇关于如何在 C++ 中构建目录字符串的先前 SO 帖子:

c ++如何从路径创建目录

于 2010-10-09T05:00:05.733 回答