2008-11-30 8 views
5

¿Cómo controlo en C++ si un archivo es un archivo normal (y no es un directorio, un conducto, etc.)? Necesito una función isFile().¿Cómo puedo verificar si un archivo es un archivo normal en C++?

DIR *dp; 
struct dirent *dirp; 

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

He intentado comparar dirp-> d_type con (unsigned char) 0x8, pero parece que no es portátil a través de sistemas diferentes.

Respuesta

3

Necesita llamar a stat (2) en el archivo, y luego usar la macro S_ISREG en st_mode.

3

C++ en sí mismo no se ocupa de los sistemas de archivos, por lo que no hay forma portátil en el idioma en sí. Los ejemplos específicos de la plataforma son stat para * nix (como ya se indicó por Martin v. Löwis) y GetFileAttributes para Windows.

Además, si no es alérgico a Boost, existe una plataforma multiplataforma boost::filesystem.

23

Puede utilizar el portátil boost::filesystem (El estándar de C++ biblioteca no podría haber hecho esto hasta la reciente introducción de std::filesystem en 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; 
    } 
} 
0

Gracias a todos por la ayuda, tengo intentado con

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

Y funciona bien. =)

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

En C++ 17, es posible utilizar el sistema de archivos std :: :: is_regular_file

#include <filesystem> // additional include 

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

Tenga en cuenta que la versión anterior de C++ puede haber tenido bajo std :: :: experimental del sistema de ficheros (Fuente: http://en.cppreference.com/w/cpp/filesystem/is_regular_file)

Cuestiones relacionadas