Как я проверяю, является ли файл регулярным файлом?

Как я регистрируюсь в C++, если файл является регулярным файлом (и не каталог, канал, и т.д.)? Мне нужна функция isFile ().

DIR *dp;
struct dirent *dirp;

while ((dirp = readdir(dp)) != NULL) {
if ( isFile(dirp)) {
     cout << "IS A FILE!" << endl;
i++;
}

Я попытался сравнить dirp-> d_type с (неподписанный символ) 0x8, но это кажется не портативным через differents системы.

5
задан Cacahuete Frito 9 July 2019 в 01:57
поделиться

4 ответа

Необходимо назвать статистику (2) на файле и затем использовать макрос S_ISREG на st_mode.

Что-то как (адаптированный из этого ответа):

#include <sys/stat.h>

struct stat sb;

if (stat(pathname, &sb) == 0 && S_ISREG(sb.st_mode))
{
    // file exists and it's a regular file
}
4
ответ дан 18 December 2019 в 05:40
поделиться

Можно использовать портативное устройство boost::filesystem (Стандартная библиотека C++, возможно, не сделала этого вплоть до недавнего введения станд.:: файловая система в C++ 17):

#include <boost/filesystem/path.hpp>
#include <boost/filesystem/operations.hpp>
#include <iostream>

int main() {
    using namespace boost::filesystem;

    path p("/bin/bash");
    if(is_regular_file(p)) {
        std::cout << "exists and is regular file" << std::endl;
    }
}
23
ответ дан 18 December 2019 в 05:40
поделиться

Спасибо всем за справку, я попробовал

while ((dirp = readdir(dp)) != NULL) { 
   if (!S_ISDIR(dirp->d_type)) { 
        ... 
        i++; 
   } 
} 

И это хорошо работает.=)

0
ответ дан 18 December 2019 в 05:40
поделиться

Сам C++ не имеет дело с файловыми системами, таким образом, нет никакого портативного пути на самом языке. Определенные для платформы примеры stat для *отклоняют (как уже отмечено Martin против Löwis) и GetFileAttributes для Windows.

Кроме того, если у Вас не аллергия на Повышение, там является довольно межплатформенным boost::filesystem.

3
ответ дан 18 December 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: