2008-11-30 7 views
5

Wie überprüfe ich in C++, ob eine Datei eine reguläre Datei ist (und kein Verzeichnis, eine Pipe usw.)? Ich brauche eine Funktion isFile().Wie überprüfe ich, ob eine Datei eine reguläre Datei in C++ ist?

DIR *dp; 
struct dirent *dirp; 

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

Ich habe versucht, zu vergleichen dirp-> d_type mit (unsigned char) 0x8, aber es scheint, durch differents Systeme nicht tragbar.

Antwort

3

Sie müssen stat (2) für die Datei aufrufen und dann das Makro S_ISREG für st_mode verwenden.

3

C++ selbst befasst sich nicht mit Dateisystemen, daher gibt es keinen portablen Weg in der Sprache. Plattformspezifische Beispiele sind stat für * nix (wie bereits von Martin v. Löwis angemerkt) und GetFileAttributes für Windows.

Auch wenn Sie nicht allergisch auf Boost sind, gibt es ziemlich Cross-Plattform boost::filesystem.

23

können Sie das tragbare boost::filesystem (der Standard C++ Bibliothek nicht diese 17 ++ bis kürzliche Einführung von std::filesystem in C bis getan haben könnte) verwenden:

#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

Vielen Dank für die Hilfe, ich habe versucht mit

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

Und es funktioniert gut. =)

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

In C++ 17, können Sie std :: filesystem :: is_regular_file

#include <filesystem> // additional include 

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

Beachten Sie, dass frühere Version von C++ möglicherweise hatte es unter std :: Versuchs :: filesystem verwenden (Quelle: http://en.cppreference.com/w/cpp/filesystem/is_regular_file)

Verwandte Themen