Системный вызов Open () для каталогов и доступа к файлам в подкаталогах - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь открыть каталог и получить доступ ко всем его файлам и подкаталогам, а также к файлам подкаталогов и т. Д. (Рекурсия).Я знаю, что могу получить доступ к файлам и подкаталогам с помощью вызова opendir, но мне было интересно, есть ли способ сделать это с помощью системного вызова open () (и как?), Или системный вызов openотносится только к файлам?

#include <stdio.h> 
#include <dirent.h> 

int main(void) 
{ 
 struct dirent *de;  // Pointer for directory entry 

// opendir() returns a pointer of DIR type.  
DIR *dr = opendir("."); 

if (dr == NULL)  // opendir returns NULL if couldn't open directory 
{ 
    printf("Could not open current directory" ); 
    return 0; 
} 


while ((de = readdir(dr)) != NULL) 
        printf("%s\n", de->d_name); 

closedir(dr);     
return 0; 
 } 

следующий код дает мне имена файлов в моем каталоге и имена подпапок, но как я могу отличить файл от подпапки, чтобы яМожно использовать рекурсию для доступа к файлам в подпапке?

любая помощь будет оценена

1 Ответ

0 голосов
/ 08 декабря 2018

вам понадобится struct stat и макрос S_ISDIR из, если вы хотите проверить, является ли это файл, вы можете использовать тот же метод, но с макросом S_ISREG.Также при использовании структур лучше выделять память перед их использованием.

#include <stdio.h> 
#include <dirent.h> 
#include <sys/stat.h>

int main(void) 
{ 
 struct dirent *de = malloc(sizeof(struct dirent));  // Pointer for directory entry 
 struct stat *info; = malloc(sizeof(struct stat));

// opendir() returns a pointer of DIR type.  
DIR *dr = opendir("."); 

if (dr == NULL)  // opendir returns NULL if couldn't open directory 
{ 
    printf("Could not open current directory" ); 
    return 0; 
} 


while ((de = readdir(dr)) != NULL) 
 {
   if((S_ISDIR(info->st_mode)
    printf("Directory:%s \n", de->d_name); 
   else printf("File:"%s \n,de->d_name);
 }
closedir(dr);     
return 0; 
} 
...