【发布时间】:2020-02-21 06:42:38
【问题描述】:
我的程序探索当前目录和所有子目录以打印所有文件名。但是,当目录的名称中有空格时,它会产生分段错误。这只发生在 linux - windows 上可以正常工作。
名称存储在dirent.d_name,即char[256]。我尝试使用它,使用c_str() 将其转换为 c 字符串,我尝试将目录名称硬编码到代码中,我尝试转义空间(尽管我不认为我正在这样做正确)。
int main()
{
struct dirent *direntry;
dir = opendir( "hello\ world" );
print_dir_rec( dir, direntry );
return 0;
}
void print_dir_rec( DIR *dir, struct dirent *direntry )
{
while( direntry = readdir(dir) )
{
switch( direntry->d_type )
{
case DT_DIR:
DIR *sub_dir = opendir( direntry->d_name );
print_dir_rec( sub_dir , direntry );
break;
}
}
return;
}
【问题讨论】:
-
dname是readdir拥有的存储空间(并且可能会被重复使用),您可以从中复制以将名称保存在其他存储空间中,但您无法转换或对dname执行任何操作成员本身,它只是被下一个名称覆盖。 -
我的意思是我已经尝试从 dname 构造一个字符串,然后传递 string.c_str() 而不是 dname
-
通常您希望存储在整个递归调用的范围内,例如
char path[1024];,然后使用snprintf创建路径,例如使用name中的当前目录,您可以使用snprintf(path, sizeof(path), "%s/%s", name, entry->d_name);不让您的函数使用const char*而不是DIR *dir,例如print_dir_rec(const char *name)并进行递归调用print_dir_rec(path)。 -
完成后你从不打电话给
closedir()? -
如果你可以使用 C++17,std::filesystem::recursive_directory_iterator 让这一切变得简单而美好。还有适用于旧版 C++ 的 Boost.Filesystem 版本。