Проблема с макросами S_ISXXX (m) из sys / stat.h - PullRequest
0 голосов
/ 10 мая 2011

У меня проблемы с S_ISXXX(m) макросами из sys/stat.h

В частности, почти все записывается в каталог.Только обычные файлы корректно отображаются как обычные файлы, ссылки, устройства, fifos, все, похоже, отображаются как каталоги.

Я что-то упустил, или это вообще ошибка?

Вот код, должно быть довольно простым (извините за чешский текст, но вы должны понять, даже не понимая этого:)

int listdir(const char *path)
{
        struct dirent *polozka;
        DIR *dir;

        dir = opendir(path);
        if (dir == NULL) 
        {
                perror("nepovedlo se otevrit adresar");
                return -1;
        }

        while((polozka = readdir(dir)))
        {
                struct stat info;
                lstat(polozka->d_name,&info);
                puts(polozka->d_name);
                if (S_ISREG(info.st_mode))
                        puts("\tObycejny soubor");
                if (S_ISDIR(info.st_mode))
                        puts("\tAdresar");
                if (S_ISCHR(info.st_mode))
                        puts("\tZnakove zarizeni");
                if (S_ISBLK(info.st_mode))
                        puts("\tBlokove zarizeni");
                if (S_ISFIFO(info.st_mode))
                        puts("\tPojemenovana roura");
                if (S_ISLNK(info.st_mode))
                        puts("\tSymbolicky link");
                if (S_ISSOCK(info.st_mode))
                        puts("\tSocket");
        }

        closedir(dir);
        return 0;
}

1 Ответ

3 голосов
/ 10 мая 2011

Вы не проверяете, действительно ли работает lstat, и я предполагаю, что это не удается.

polozka->d_name содержит только имя файла без пути.Если в вашем примере path отличается от текущего каталога, большинство вызовов lstat завершатся неудачно, и info останется в неопределенном состоянии.

...