Как я регистрируюсь в 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 системы.
Необходимо назвать статистику (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
}
Можно использовать портативное устройство 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;
}
}
Спасибо всем за справку, я попробовал
while ((dirp = readdir(dp)) != NULL) {
if (!S_ISDIR(dirp->d_type)) {
...
i++;
}
}
И это хорошо работает.=)
Сам C++ не имеет дело с файловыми системами, таким образом, нет никакого портативного пути на самом языке. Определенные для платформы примеры stat
для *отклоняют (как уже отмечено Martin против Löwis) и GetFileAttributes
для Windows.
Кроме того, если у Вас не аллергия на Повышение, там является довольно межплатформенным boost::filesystem
.