c - stat using S_ISDIR 似乎并不总是有效
问题描述
我注意到我的函数输出中有一些奇怪的东西(在 c 中)。此函数在目录中检测元素是文件还是子目录。
// i cant detected properly if an element is a file or a dir
int RecursiveSearch(char *Dir){
DIR *Directory;
//DIR *SubDirectory;
struct dirent *entry;
struct stat filestat;
printf("I am Reading %s Directory\n", Dir);
Directory = opendir(Dir);
if(Directory == NULL)
{
perror("Unable to read directory.. i'm leaving\n");
return(1); // leave
}
/* Read directory entries */
while( (entry=readdir(Directory)) )
{
stat(entry->d_name,&filestat);
if( S_ISDIR(filestat.st_mode) ){
printf("%4s: %s\n","Dir",entry->d_name);
if (strstr(entry->d_name, ".") == NULL && strstr(entry->d_name, "..") == NULL ) // to not infinit loop
{
// Recursion
printf("\n*Entering a subDirectory*\n");
RecursiveSearch(entry->d_name);
printf("\n*Leaving a subDirectory*\n");
}
}
else
printf("%4s: %s\n","File",entry->d_name);
}
closedir(Directory);
return(0);
}
我主要这样称呼它来测试它
RecursiveSearch("./Directories");
我的问题在“开始递归研究..”下
如您所见,SubDir 不是文件。我看不出我在函数中做错了什么。
如果您需要任何其他说明,请询问。
编辑 :
int RecursiveSearch(char *Dir){
DIR *Directory;
struct dirent *entry;
struct stat filestat;
printf("I am Reading %s Directory\n", Dir);
Directory = opendir(Dir);
if(Directory == NULL)
{
perror("Unable to read directory.. i'm leaving\n");
return(1); // leave
}
/* Read directory entries */
while( (entry=readdir(Directory)) )
{
char fullname[100];
sprintf(fullname, "%s/%s",Dir,entry->d_name);
stat(fullname,&filestat);
if( S_ISDIR(filestat.st_mode) ){
printf("%4s: %s\n","Dir",fullname);
if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0 ) // to not infinite loop
{
// Recursion
printf("\n*Entering a subDirectory*\n");
RecursiveSearch(fullname);
printf("\n*Leaving a subDirectory*\n");
}
}
else
printf("%4s: %s\n","File",fullname);
}
closedir(Directory);
return(0);
}
解决方案
entry->d_name
只是名称,它没有目录前缀。它是相对于进程的工作目录解释的,而不是函数递归中的当前目录。
调用其他函数(包括递归)时,需要在名称前加上目录名。
此外,您需要使用strcmp()
将名称与.
和进行比较..
。使用strstr()
可防止递归到名称中包含.
任何位置的目录。
int RecursiveSearch(char *Dir){
DIR *Directory;
struct dirent *entry;
struct stat filestat;
printf("I am Reading %s Directory\n", Dir);
Directory = opendir(Dir);
if(Directory == NULL)
{
perror("Unable to read directory.. i'm leaving\n");
return(1); // leave
}
/* Read directory entries */
while( (entry=readdir(Directory)) )
{
char fullname[MAXPATH];
sprintf(fullname, "%s/%s", Dir, entry->d_name);
stat(fullname,&filestat);
if( S_ISDIR(filestat.st_mode) ){
printf("%4s: %s\n","Dir",fullname);
if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0 ) // to not infinite loop
{
// Recursion
printf("\n*Entering a subDirectory*\n");
RecursiveSearch(fullname);
printf("\n*Leaving a subDirectory*\n");
}
}
else
printf("%4s: %s\n","File",fullname);
}
closedir(Directory);
return(0);
}
推荐阅读
- mysql - MySql - 如何根据加入另一个表的多个值从一个表中选择行
- sql - 多个内连接和子查询的查询优化
- javascript - Express.js:TypeError:res.sendFile 需要路径参数
- android - 所有现有项目的 Android Things 控制台将于 2022 年 1 月 5 日关闭
- json - 使用 ArduinoJson 库无法使用 JsonObject 解析 Json
- mongodb - .Net核心字典中的Mongodb $inc运算符
- uml - 支付场景用例图
- javascript - 上传文件,axios 工作,但 fetch API 没有,我做错了什么?
- discord - 使用 Discord.Js 更改 Discord 公会的图标
- javascript - 如何禁用查看器的拖动?