Readdir(), начиная с точек вместо файлов

У меня небольшая проблема. Я читаю файлы из каталога, и он работает, но он сначала читает два дополнительных файла... что это такое? например, есть список файлов: "A348", "A348A", "A348B" и это то, что я получаю: ".", "..", "A348", "A348A", "A348B"???

DIR *dir;
struct dirent *dp;
char * file_name;
while ((dp=readdir(dir)) != NULL) {

        file_name = dp->d_name;            
}

Ответ 1

. - это запись каталога для текущего каталога

.. - это запись каталога для каталога на один уровень вверх в иерархии

Вам нужно просто отфильтровать их, используя:

if ( !strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..") )
{
     // do nothing (straight logic)
} else {
     file_name = dp->d_name; // use it
}

Подробнее об использовании . и .. в Windows:

".\\file" - это файл с именем file в текущем рабочем каталоге

"..\\file" - это файл в родительском каталоге

"..\\otherdir\\file" - это файл, который находится в каталоге с именем otherdir, который находится на том же уровне, что и текущий каталог (нам не нужно знать, в каком каталоге мы находимся).

Изменить: использование автономного примера readdir:

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

int main()
{
    DIR *dir;
    struct dirent *dp;
    char * file_name;
    dir = opendir(".");
    while ((dp=readdir(dir)) != NULL) {
        printf("debug: %s\n", dp->d_name);
        if ( !strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..") )
        {
            // do nothing (straight logic)
        } else {
            file_name = dp->d_name; // use it
            printf("file_name: \"%s\"\n",file_name);
        }
    }
    closedir(dir);
    return 0;
}

Ответ 2

Избегайте брать файлы, чье имя. и..