Проверьте, является ли элемент в каталоге папкой на C

я хотел бы проверить, когда я просматриваю все файлы в каталоге, является ли один из файлов/элементов в каталоге папкой (другой каталог)

код, с которого я начал (используя dirent.h):

DIR *dir;
struct dirent *ent;
if ((dir = opendir ("c:\\src\\")) != NULL) {
  /* print all the files and directories within directory */
  while ((ent = readdir (dir)) != NULL) {
    if (ent.is_folder()) // here is what I want to implement
      printf ("Folder: %s\n", ent->d_name);
    else
      printf("File %s\n", ent->d_name);
  }
  closedir (dir);
} else {
  /* could not open directory */
  perror ("");
  return EXIT_FAILURE;
}

person Raz Omry    schedule 24.05.2017    source источник
comment
в чем проблема у тебя?   -  person P.A    schedule 24.05.2017
comment
нет никакой функции ent.is_folder() вы знаете.. это c. Если вы видите, я хочу проверить, является ли ent (который читается из каталога) каталогом (папкой) или файлом   -  person Raz Omry    schedule 24.05.2017
comment
взгляните на stackoverflow.com/questions/4553012/   -  person P.A    schedule 24.05.2017
comment
stackoverflow.com/questions/1036625/   -  person P.A    schedule 24.05.2017
comment
Я смущен. Вы звоните opendir и readdir, чтобы получить dirent (а не openfolder и readfolder, чтобы получить folderent), и вы хотите знать, является ли dirent каталогом, так почему слово папка вообще используется в вопросе, и почему вы хотите реализовать is_folder() вместо is_directory()?   -  person William Pursell    schedule 25.05.2017


Ответы (1)


Readdir() возвращает структуру, в которой у вас есть переменная для проверки, содержит ли ваш каталог файлы и/или каталоги. Вот структура:

struct dirent {
    ino_t          d_ino;       /* numéro d'inœud */
    off_t          d_off;       /* décalage jusqu'à la dirent suivante 
*/
    unsigned short d_reclen;    /* longueur de cet enregistrement */
    unsigned char  d_type;      /* type du fichier */
    char           d_name[256]; /* nom du fichier */
};

Таким образом, вы будете использовать в своем коде: ent->d_type для доступа к этой переменной. Затем с флагом DT_DIR вы проверите, является ли это каталогом, и если это файл с флагом DT_REG.

Код ниже работает:

DIR *dir;
struct dirent *ent;

if ((dir = opendir ("c:\\src\\")) != NULL)
{
    /* print all the files and directories within directory */
    while ((ent = readdir (dir)) != NULL) {
        if (ent->d_type == DT_DIR)// here is what I want to implement
            printf ("Folder: %s\n", ent->d_name);
        else if (ent->d_type == DT_REG)
            printf("File %s\n", ent->d_name);
    }
    closedir (dir);
}
else
{
/* could not open directory */
    perror ("");
        return EXIT_FAILURE;
}
person MIG-23    schedule 24.05.2017