Wie kann ich überprüfen, ob eine Datei eine reguläre Datei ist?
-
11-07-2019 - |
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.
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;
}