2013-04-01 3 views
0

Я пытаюсь получить количество каталогов в папке, кроме файлов, но я не могу получить правильный результат. Кто-нибудь поможет мне решить эту проблему? Особенно, что мне следует отправить в функцию 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); 
} 
+1

Что вы получаете вместо «правильного результата»? – 2013-04-01 20:37:44

+0

Передача "dirp" в isDirectory() кажется неправильной. Это опечатка? – kkrambo

+1

Этот комментарий может быть совершенно бесполезным, но мне больно видеть так много строк кода для концептуального однострочного ... 'ls -d /*/| wc -l' – shx2

ответ

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); 
+0

Это не работает Teppic. Я получаю количество всех файлов в текущем каталоге, когда я следую вашему пути. Есть другой способ? –

+0

@Sabri - Я обновил ответ. – teppic

+0

Спасибо Teppic. Я так рад. вы были правы .. –

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-сервере. И это работает хорошо. SO @teppic прав. Но обратите внимание, что в коде число каталогов включает в себя два конкретных «..» (родительский каталог) и «.». (Текущий каталог). Если вы не хотите, чтобы включить его, вы можете изменить:

printf("direc Num : %d\n",y); 

в:

printf("direc Num : %d\n",y-2); 

Надеется, что это помогает!

+0

Это точка, но я не могу найти то, что я должен отправить в функцию. Как я могу получить информацию о файле? –

+0

Если вам действительно нужно вызвать функцию int isDirectory (char * path), вы можете сделать это как: isDirectory (direntp-> d_name); – Sheng

+0

Ух, конечно, Теппик прав Шейн. Я забыл о директоре и родительском каталоге. Это действительно отлично работает. Спасибо всем за вашу помощь. –

Смежные вопросы