2010-02-04 25 views
13

Obecnie mam trochę kodu podobnego (skrócone i usunięto kilka błędów sprawdzania):wieloplatformowym sposobem sprawdzenia, czy plik jest katalogiem

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

to działa maśle na moim komputerze z systemem Linux. Jednak na innym komputerze (wygląda jak SunOS, SPARC):

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

pojawia się następujący błąd w czasie kompilacji:

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

Myślałem nagłówek dirent.h był crossplatform (do maszyn POSIX). Jakieś sugestie.

+0

Kiedy widzę platformę między różnymi platformami, zakładam, że masz na myśli system Windows i prawdopodobnie także system operacyjny OS/2. :-) Odpowiedź na Just Posix jest łatwa, a ktoś już ją dał. – Omnifarious

Odpowiedz

18

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

Definicja dirent struct w Solaris nie zawierają pola d_type. trzeba by wprowadzić zmiany następująco

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

zmiany do

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

Od stat jest również standardem POSIX powinno być więcej cross-platform. Możesz jednak użyć standardu if ((s.st_mode & S_IFMT) == S_IFDIR).

+9

W rzeczywistości POSIX definiuje makro dla tego: 'if (S_ISDIR (s.st_mode))'. Oczywiście powinieneś sprawdzić, czy 'stat()' zakończyło się pomyślnie. – mark4o

+0

Zauważ, że fstatat (2) może być bardziej preferowany niż stat (2), ponieważ 'de-> d_name' odnosi się do otwartego katalogu. – Igor