Вывод списка содержимого каталога и проверка, является ли элемент файлом или каталогом (C) - PullRequest
2 голосов
/ 12 марта 2019

Я пытался найти способ сопоставить содержимое каталога, а также проверить, является ли найденный «элемент» файлом или каталогом.

Я перепробовал все "решения", найденные здесь: Как проверить, существует ли каталог? , Как проверить, существует ли каталог в Windows в C? и Проверка, является ли файл каталогом или просто файлом

(поэтому мой пост здесь не дубликат)

Ничто не помогало мне. Я на Windows 10. Я не фанат этих библиотек Windows, во всяком случае. Вот почему я ищу способ, который только стандартный C. Вот мой код:

struct dirent *de;
DIR *dr = opendir(opts->dirname);

#define DF_ISDIR 0x100
#define DF_ISFILE 0x200
#define DF_NOEXIST 0x400


while ((de = readdir(dr)) != NULL) {
    int exists = df_isdirectory(de->d_name);
    printf("[%s]: '%s'\n", exists == DF_ISDIR ? "DIR" : exists == DF_ISFILE ? "FILE" : "WHATEVER", de->d_name);
}

и

int df_isdirectory(const char *name) {
assert(name != NULL);

DIR *dp = NULL;
if (_access(name, F_OK) == 0) {
    if ((dp = opendir(name)) != NULL) {
        closedir(dp);
        return DF_ISDIR; //  element is directory
    } else {
        return DF_ISFILE; // element is a file
    }
}

return DF_NOEXIST; // element is whatever

}

Это дает мне следующий результат:

enter image description here

Как мы видим, программа обнаруживает, что ... и. как каталоги, но не один элемент в моем каталоге. Даже если «another» и «dfgsdgf» являются директориями!

enter image description here

Так почему же мои действительные каталоги не считаются каталогом? Примечание: один каталог ("dfgsdgf") пуст, другой ("другой") заполнен 2 файлами.

Потратив так много времени и испробовав кучу «рабочих» решений, я постепенно устаю от этого. Я хочу получить подробное объяснение, ПОЧЕМУ МОЙ КОД НЕ РАБОТАЕТ, КАК ОЖИДАЕТСЯ, и фрагмент кода, КОТОРЫЙ РАБОТАЕТ на 100%.

PS: мой тестовый каталог C: \ test
Мой исполняемый файл не находится в той же директории.

Спасибо, и хорошего дня! ~ Себастьян

1 Ответ

1 голос
/ 12 марта 2019

Здесь вы открываете каталог, указанный в вашей структуре opts:

DIR *dr = opendir(opts->dirname);

, содержимое opts->dirname равно C:\test.Однако, здесь:

if ((dp = opendir(name)) != NULL) {

вы пытаетесь открыть запись каталога относительно вашего cwd (который находится где-то еще).Действительно, проверка _access() уже не удалась из-за этого.

Попробуйте вызвать

chdir(opts->dirname);

перед циклом while() или создайте полный путь в строке, чтобы передать его в _access()и opendir() в вашей функции df_isdirectory().

...