2010-02-04 11 views
13

Actualmente tengo un poco de código como (condensada y sacó un montón de comprobación de errores):Cruz manera plataforma de comprobar si un archivo es un directorio

dp = readdir(dir); 
if (dp->d_type == DT_DIR) { 
} 

Esto funciona a las mil maravillas en mi máquina Linux. Sin embargo en otra máquina (se parece a SunOS, SPARC):

SunOS HOST 5.10 Generic_127127-11 sun4u sparc SUNW,Ultra-5_10 

me sale el siguiente error en tiempo de compilación:

error: structure has no member named `d_type' 
error: `DT_DIR' undeclared (first use in this function) 

pensé que era la cabecera dirent.h multiplataforma (para máquinas POSIX). Alguna sugerencia.

+0

Cuando veo multiplataforma, tiendo a asumir que te refieres a Windows y posiblemente OS/2 también. :-) La respuesta solo para Posix es fácil, y alguien ya la dio. – Omnifarious

Respuesta

18

Ref http://www.nexenta.org/os/Porting_Codefixes:

La definición dirent estructura en Solaris no contiene el campo d_type. Lo que se necesita para hacer los cambios de la siguiente manera

if (de->d_type == DT_DIR) 
{ 
    return 0; 
} 

cambios a

struct stat s; /*include sys/stat.h if necessary */ 
.. 
.. 
stat(de->d_name, &s); 
if (s.st_mode & S_IFDIR) 
{ 
    return 0; 
} 

Desde stat también es estándar POSIX que debería ser más multiplataforma. Pero es posible que desee utilizar if ((s.st_mode & S_IFMT) == S_IFDIR) para seguir el estándar.

+9

En realidad, POSIX define una macro para esto: 'if (S_ISDIR (s.st_mode))'. También, por supuesto, debe verificar que 'stat()' sea exitoso primero. – mark4o

+0

Tenga en cuenta que fstatat (2) podría ser más preferible que stat (2), porque 'de-> d_name' es relativo al directorio abierto. – Igor

Cuestiones relacionadas