Как правильно использовать функцию S_ISREG - PullRequest
1 голос
/ 06 апреля 2019

РЕДАКТИРОВАТЬ: После некоторой помощи от форума стало ясно, что эта проблема не в использовании S_ISREG(), а в моем использовании lstat(). Извините за вводящий в заблуждение вопрос.

Я смотрю в каталог и пытаюсь определить разницу между обычными файлами и подкаталогами.

Я просматривал проблемы других людей с этой проблемой, и хотя некоторые из них были похожими, ни на один из них не было получено достаточно четкого ответа, чтобы исправить мой код.

    int find(char *argv)
    {
        DIR *pointerToDir;
        struct dirent *pointerToDirent;
        struct stat status;
        int mode;

        pointerToDir = opendir(argv);
        if(pointerToDir == NULL)
        {
            printf("Can't open that directory (or it doesn't exist)\n");
            closedir(pointerToDir);
            return 0;
        }
        else
        {
            while((pointerToDirent = readdir(pointerToDir)) != NULL)
            {
                lstat(pointerToDirent->d_name, &status);
                mode = S_ISREG(status.st_mode);
                if(mode != 0)
                    printf("%s must be a file\n", pointerToDirent->d_name);
                else
                    printf("%s must be a dir\n", pointerToDirent->d_name);
            }
            closedir(pointerToDir);
            return 0;
        }
    }

Я передаю программе тестовый каталог, в котором есть 2 подкаталога и 2 обычных файла. Макет будет примерно таким:

dir1

  • sub1
  • sub2
  • dir1.txt
  • test.c

Теперь, когда я запустил свою программу и передал "dir1" в качестве аргумента, я ожидал, что он вернет следующее:

. должен быть реж

.. должен быть директ

sub1 должен быть dir

dir1.txt должен быть файлом

sub2 должен быть dir

test.c должен быть файл

Но вместо этого возвращается, что они все "dirs". Чего мне не хватает?

...