Frage

Wie kann ich in C ++ überprüfen, ob eine Datei eine reguläre Datei ist (und ist kein Verzeichnis, ein Rohr, etc.)? Ich brauche eine Funktion isFile ().

DIR *dp;
struct dirent *dirp;

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

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

War es hilfreich?

Lösung

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

So etwas wie (angepasst von diese Antwort ):

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

Andere Tipps

Sie können die portable boost::filesystem (der Standard C ++ Bibliothek nicht diese bis vor kurzem erfolgte Einführung von std :: filesystem getan haben könnte in 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 ++ selbst nicht mit Dateisystemen umgehen, so gibt es keine tragbare Art und Weise in der Sprache selbst. Plattformspezifische Beispiele sind stat für * nichts (wie bereits von Martin v zur Kenntnis genommen. Löwis) und GetFileAttributes für Windows.

Auch wenn Sie nicht allergisch sind href="http://www.boost.org/" zum Erhöhung , gibt es ziemlich plattformübergreifende boost::filesystem.

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 ++ hat es unter std hat konnte :: experimenteller :: filesystem (Quelle: http://en.cppreference.com/w/cpp/filesystem/is_regular_file )

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. =)

#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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top