我怎么办C++如果一文件是一个普通的文件(而不是一个目录,一个管道,等等)?我需要一个功能isFile().

DIR *dp;
struct dirent *dirp;

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

我已经试过比较dirp->d_type与(unsigned char)0x8,但它似乎没有便携式通过不同的系统。

有帮助吗?

解决方案

您需要调用上的文件的stat(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 ++库无法这样做,直到最近推出的的std ::文件系统的在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;
    }
}

C ++本身不涉及文件系统,因此有一个在语言本身没有可移植的方法。特定于平台的实例为stat * nix中和GetFileAttributes的Windows(如已经由马丁诉Löwis说明)。

另外,如果你不过敏升压,有相当跨平台boost::filesystem

C++17,可以使用std::文件系统::is_regular_file

#include <filesystem> // additional include

if(std::filesystem::is_regular_file(yourFilePathToCheck)) 
    ; //Do what you need to do

注意早期版本的C++可能已经下标准::实验::文件系统(来源: http://en.cppreference.com/w/cpp/filesystem/is_regular_file)

感谢大家的帮助,我已经试过

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

和它工作正常。 =)

#include <boost/filesystem.hpp>

bool isFile(std::string filepath)
{
    boost::filesystem::path p(filepath);
    if(boost::filesystem::is_regular_file(p)) {
        return true;
    }
    std::cout<<filepath<<" file does not exist and is not a regular file"<<std::endl;
    return false;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top