В C, как сопоставить значение d_type с «состоянием» элемента?

#c

Вопрос:

Я перечисляю элементы в каталоге на языке C.

Я использую следующий код:

 struct dirent *dir_entry;

DIR *dr = opendir(argv[path_arg_index]);
while ((dir_entry = readdir(dr)) != NULL) {
    printf("%s - %u n", dir_entry->d_name, dir_entry->d_type);
}
 

Какие отпечатки:

 build - 4 
src - 4 
.. - 4 
README.md - 8 
.gitignore - 8 
. - 4 
.git - 4 
 

Учитывая выходные данные, 4 представляет собой каталог, 8 — файл.

Но из некоторых документов (например, здесь) видно, что d_type может принимать более двух разных значений.

Два вопроса, связанных с этим:

  • почему я получаю цифры/числа-это значения, а не такие вещи, как «DT_DIR», как указано в ссылке выше ?
  • Как узнать, какие «числовые» значения связаны с возможными значениями, указанными в ссылке выше ?

Комментарии:

1. Вы получаете числа, потому что они определены как числа. Вы сравниваете их с определениями ( DT_DIR и т. Д.), И вам не нужно знать, какие числа стоят за определениями, и это будет работать везде.

2. @SamiKuhmonen Действительно. Автозаполнение также показывает это мне. Я должен был это проверить. Спасибо. Дайте ответ, и я приму его.

3. Из-за #define DT_DIR 0x04 и #define DT_FILE 0x08 соответственно. Вы можете написать функцию. char *print_dType(тип uint8_t) { переключатель (тип) { регистр DT_DIR: возврат «DIR»; разрыв; …}}, что-то в этом роде.

Ответ №1:

  1. Значения, потому что они являются перечислениями. ссылка: https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6/ /refs/heads/jb-dev/sysroot/usr/include/dirent.h
  2. Типы не согласованы в разных ОС, поэтому необходимо проверить «dirent.h» или «sys/types.h» этой ОС. ссылка: https://c-for-dummies.com/blog/?p=3252

Вы также можете использовать функцию статистики, чтобы узнать, является ли это файлом или каталогом из «sys/stat.h».

ниже приведен пример, если вы хотите распечатать файл или директорию:

 struct dirent *dir_entry;
DIR *dr = opendir(argv[path_arg_index]);
while( (dir_entry = readdir(dr)) )
{
    stat(entry->d_name,amp;filestat);
    if( S_ISDIR(filestat.st_mode) )
        printf("%4s: %sn","Dir", dir_entry->d_name);
    else
        printf("%4s: %sn","File", dir_entry->d_name);
}
closedir(folder);
 

Комментарии:

1. stat(entry->d_name хм…. тебе следует пойти с fstatat(dirfd(dr), entry->d_name, amp;filestat, 0) . имя-это только имя, без пути.