gpt4 book ai didi

c++ - 如何在使用 dirent.h 阅读时跳过目录

转载 作者:行者123 更新时间:2023-11-28 08:05:28 25 4
gpt4 key购买 nike

我正在尝试使用 dirent.h

中提供的功能递归打开文件

我的问题是:我无法跳过无法打开的目录。我希望它打开它可以打开的目录并跳过它不能打开的目录并移动到下一个目录而不是失败退出。我应该怎么做才能解决这个问题?

这是我尝试使用的一个简单代码

int acessdirs(const char *path)
{
struct dirent *entry;
DIR *dp;
char fpath[300];
if(dp=opendir(path))
{
while((entry=readdir(dp)))
do things here
}
else
{
std::cout<<"error opening directory";
return 0;
}
return 1;
}

我在 windows 7 上使用了相同的样式并且它工作正常。但是它在 windows xp 上崩溃了,当我调试它时我发现它在尝试打开时崩溃了“系统卷信息”。我真的不需要访问这个文件夹,我希望有什么方法可以跳过它。

这是我的真实代码:

有点长。

int listdir(const char *path) 
{
struct dirent *entry;
DIR *dp;

if(dp = opendir(path))
{
struct stat buf ;

while((entry = readdir(dp)))
{
std::string p(path);
p += "\\";
p += entry->d_name;
char fpath[300];
if(!stat(p.c_str(), &buf))
{
if(S_ISREG(buf.st_mode))
{
sprintf(fpath,"%s\\%s",path,entry->d_name);
stat(fpath, &buf);
std::cout<<"\n Size of \t"<<fpath<<"\t"<<buf.st_size;
fmd5=MDFile (fpath);
}//inner second if
if(S_ISDIR(buf.st_mode) &&
// the following is to ensure we do not dive into directories "." and ".."
strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..") )
{
listdir(p.c_str());
}
}//inner first if
else
std::cout << "ERROR in stat\n";
}//end while
closedir(dp);
}//first if
else
{
std::cout << "ERROR in opendir\n";
return 0;
}
return 1;

}//listdir()

最佳答案

你最大的问题似乎在这里:

sprintf(fpath,"%s\\%s",path,entry->d_name);
stat(fpath, &buf);

没有看到 fpath 的声明,很难确定,但你要么

  • sprintf 调用中溢出 fpath,导致未定义的行为。 “系统卷信息”是一个很长的名字。你真的应该使用 snprintf

  • 不检查 stat 调用的返回值。如果它返回 -1,我不确定 buf 的内容是什么。

更重要的是,如果你可以使用 POSIX 的东西,函数 ftw是标准的,应该提供您要在此处实现的大部分功能。

关于c++ - 如何在使用 dirent.h 阅读时跳过目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10392006/

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