gpt4 book ai didi

c++ - opendir() 以空格命名失败,在 linux 上运行

转载 作者:太空宇宙 更新时间:2023-11-04 09:58:04 24 4
gpt4 key购买 nike

我的程序探索当前目录和所有子目录以打印所有文件名。但是,当目录名称中有空格时,它会产生段错误。这只发生在 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;
}

最佳答案

通过传递 DIR* 指针和 struct dirent* 指针作为参数而不是简单地形成并传递下一个路径以打开,您会遇到问题。您希望在递归函数本身内处理目录的打开,而不是作为从 main() 传递的单个指针,例如

void print_dir_rec(const char *name)
{
DIR *dir;
struct dirent *entry;

if (!(dir = opendir(name)))
return;

while ((entry = readdir(dir)) != NULL) {
if (entry->d_type == DT_DIR) {
char path[1024];
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
continue;
snprintf(path, sizeof(path), "%s/%s", name, entry->d_name);
printf("[%s]\n", entry->d_name);
print_dir_rec(path);
}
}
closedir(dir);
}

(注意:您可以根据需要或使用 PATH_MAX 宏调整为 path 提供的字符数)

这样一来,在每个导致问题的递归调用中都不会重复使用单个指针。列出当前目录下的所有目录的一个简短示例可能是:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/types.h>

void print_dir_rec(const char *name)
{
DIR *dir;
struct dirent *entry;

if (!(dir = opendir(name)))
return;

while ((entry = readdir(dir)) != NULL) {
if (entry->d_type == DT_DIR) {
char path[1024];
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
continue;
snprintf(path, sizeof(path), "%s/%s", name, entry->d_name);
printf("[%s]\n", entry->d_name);
print_dir_rec(path);
}
}
closedir(dir);
}

int main(void) {
print_dir_rec(".");
return 0;
}

看开读是怎么处理的,需要传递什么信息。通过在每个递归调用中为 path 提供存储空间,您可以保证名称保留在范围内,直到该递归调用返回。

如果您还有其他问题,请告诉我。

关于c++ - opendir() 以空格命名失败,在 linux 上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58549598/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com