2010-02-04 3 views
13

Attualmente ho un po 'di codice come (condensato e rimosso un po' di controllo degli errori):Croce piattaforma modo di testare se un file è una directory

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

Questo funziona a meraviglia sulla mia macchina Linux. Tuttavia su un'altra macchina (sembra SunOS, SPARC):

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

ottengo il seguente errore in fase di compilazione:

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

ho pensato che il colpo di testa dirent.h era multipiattaforma (per le macchine POSIX). Eventuali suggerimenti.

+0

Quando vedo multipiattaforma, tendo a presumere che tu intenda Windows e possibilmente anche OS/2. :-) La risposta per Posix è semplice, e qualcuno lo ha già dato. – Omnifarious

risposta

18

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

La definizione dirent struct di Solaris non contiene il campo d_type. Si avrebbe bisogno di apportare le modifiche come segue

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

modifiche

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

Dal stat è anche standard POSIX dovrebbe essere più cross-platform. Ma potresti voler usare if ((s.st_mode & S_IFMT) == S_IFDIR) per seguire lo standard.

+9

In realtà POSIX definisce una macro per questo: 'if (S_ISDIR (s.st_mode))'. Ovviamente dovresti anche controllare che 'stat()' abbia successo per primo. – mark4o

+0

Si noti che fstatat (2) potrebbe essere più preferibile rispetto a stat (2), perché 'de-> d_name' è relativo alla directory aperta. – Igor

Problemi correlati