2008-11-30 130 views
5

如果文件是普通文件(而不是目錄,管道等),我該如何檢查C++?我需要一個函數isFile()。如何檢查文件是否是C++中的常規文件?

DIR *dp; 
struct dirent *dirp; 

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

我試着比較dirp-> d_type有(無符號字符)0x8中,但似乎通過型動物系統不便於攜帶。

回答

3

您需要在文件上調用stat(2),然後在st_mode上使用S_ISREG宏。

3

C++本身不處理文件系統,所以在語言本身中沒有可移植的方式。針對* ​​nix的平臺特定示例爲stat(正如Martin v。L ?wis已經注意到的)和針對Windows的GetFileAttributes

此外,如果你不是對Boost過敏,有相當多的跨平臺boost::filesystem

23

可以使用便攜式boost::filesystem(標準C++庫不可能在C++ 17做到了這一點,直到最近推出的std::filesystem):

#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; 
    } 
} 
0

謝謝大家的幫助下,我嘗試與

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

它工作正常。 =)

0
#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; 
} 
1

在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