我正在尝试获取文件夹中除目录之外的目录数,但我无法获得正确的结果。有人帮我解决了这个问题吗?特别是我应该发送到isDirectory()函数?
int listFilesIndir(char *currDir)
{
struct dirent *direntp;
DIR *dirp;
int x ,y =0 ;
if ((dirp = opendir(currDir)) == NULL)
{
perror ("Failed to open directory");
return 1;
}
while ((direntp = readdir(dirp)) != NULL)
{
printf("%s\n", direntp->d_name);
x= isDirectory(dirp);
if(x != 0)
y++;
}
printf("direc Num : %d\n",y );
while ((closedir(dirp) == -1) && (errno == EINTR)) ;
return 0;
}
int isDirectory(char *path)
{
struct stat statbuf;
if (stat(path, &statbuf) == -1)
return 0;
else
return S_ISDIR(statbuf.st_mode);
}
答案 0 :(得分:1)
您正在向该函数发送目录流,并将其视为路径。
Linux和其他一些Unix系统包含了直接获取此信息的方法:
while ((direntp = readdir(dirp)) != NULL)
{
printf("%s\n", direntp->d_name);
if (direntp->d_type == DT_DIR)
y++;
}
否则,请确保将正确的详细信息发送到该功能,即
x= isDirectory(direntp->d_name);
答案 1 :(得分:1)
对你的功能的调用是错误的。
x= isDirectory(dirp);
虽然功能原型是:
int isDirectory(char *path)
它需要一个字符串作为参数,但你给它一个“DIR * dirp;”。我将代码更改为:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int listFilesIndir(char *currDir)
{
struct dirent *direntp;
DIR *dirp;
int x ,y =0 ;
if ((dirp = opendir(currDir)) == NULL)
{
perror ("Failed to open directory");
return 1;
}
while ((direntp = readdir(dirp)) != NULL)
{
printf("%s\n", direntp->d_name);
if(direntp->d_type == DT_DIR)
y++;
}
printf("direc Num : %d\n",y );
while ((closedir(dirp) == -1) && (errno == EINTR)) ;
return 0;
}
int main(int argc, char **argv){
if(argc == 2){
// Check whether the argv[1] is a directory firstly.
listFilesIndir(argv[1]);
}
else{
printf("Usage: %s directory", argv[0]);
}
return 0;
}
我在我的Linux服务器上测试过它。它运作良好。所以@teppic是对的。但要注意,在代码中,目录的数量包括两个特定的“..”(父目录)和“。”。 (当前目录)。如果您不想包含它,可以更改:
printf("direc Num : %d\n",y );
成:
printf("direc Num : %d\n",y-2 );
希望它有所帮助!