2008-09-28 17 views

Respuesta

26

Llame al GetFileAttributes y compruebe el atributo FILE_ATTRIBUTE_DIRECTORY.

+3

Si necesita soportar Windows 98, entonces no puede usar esta función. Vea mi respuesta sobre PathIsDirectory a continuación si necesita soporte Win98. – jeffm

85

stat() le dirá esto.

struct stat s; 
if(stat(path,&s) == 0) 
{ 
    if(s.st_mode & S_IFDIR) 
    { 
     //it's a directory 
    } 
    else if(s.st_mode & S_IFREG) 
    { 
     //it's a file 
    } 
    else 
    { 
     //something else 
    } 
} 
else 
{ 
    //error 
} 
+2

el único problema que tengo con este código es el comentario en el caso else. El hecho de que algo no sea un directorio no significa que sea un archivo. – dicroce

+0

@dicroce: Sí, es verdad; fijo. –

+0

cuando intento usar esto, obtengo "aggregate" main (int, char **) :: stat s 'tiene un tipo incompleto y no se puede definir "y realmente no pude obtener cuál es el error. Da error primero en la línea de struct stat s; ¿Cuál podría ser mi error? – MeM

13

En Win32, generalmente utilizo PathIsDirectory y sus funciones hermanas. Esto funciona en Windows 98, que GetFileAttributes no (según la documentación de MSDN.)

+3

¿Funciona esto en Windows 3.11? – pilkch

+1

No lo he probado pero la versión documentada más antigua se distribuyó con Windows 95, por lo que probablemente no. – jeffm

+0

Definitivamente puede usar 'GetFileAttributes()' en Windows 98, y AFAIK es anterior a la existencia de 'PathIsDirectory()'. ¡No puede confiar en la documentación de MSDN cuando verifica los requisitos mínimos del sistema operativo de una API porque MSDN yace! Cuando MS deja de ser compatible con una versión de sistema operativo, les gusta eliminar la mayoría de las referencias de la documentación de MSDN, especialmente en los requisitos mínimos del sistema operativo de las API existentes. –

-1

Más fácil de tratar FileInfo.isDir() en qt

+0

Por favor, expanda su respuesta. Incluya algún código de ejemplo, etc. –

+6

¿Podría explicar por qué utilizar una biblioteca GUI cuando se cuestiona el acceso a un sistema de archivos? – harper

+0

Gracias, eso es exactamente lo que estaba buscando. (A través de Google.) – ens

-1

Si está utilizando CFile puede probar

CFileStatus status; 
    if (CFile::GetStatus(fileName, status) && status.m_attribute == 0x10){ 
     //it's directory 
} 
+0

no podría incluir CFile en realidad .. – Kasparov92

3

Con C++ 14/C++ 17 puede usar la plataforma independiente is_directory() y is_regular_file() del filesystem library.

#include <filesystem> // C++17 (or Microsoft-specific implementation in C++14) 

std::string pathString = "/my/path"; 
std::filesystem::path path(pathString); // Construct the path from a string. 
if (path.is_directory()) { // Using the non-throwing overload. 
    // Process a directory. 
} 
if (path.is_regular_file()) { // Using the non-throwing overload. 
    // Process a regular file. 
} 

En C++ 14 use std::experimental::filesystem.

#include <experimental/filesystem> // C++14 

std::experimental::filesystem::path path(pathString); 

En la sección File types más verificaciones están disponibles.

Cuestiones relacionadas