2010-02-04 31 views
13

Hiện nay tôi có một số mã như (ngưng tụ và loại bỏ một loạt các kiểm tra lỗi):chéo nền tảng cách kiểm tra xem một tập tin là một thư mục

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

này hoạt động thuận buồm xuôi trên máy Linux của tôi. Tuy nhiên trên máy khác (trông giống như SunOS, sparc):

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

tôi nhận được lỗi sau tại thời gian biên dịch:

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

Tôi nghĩ dirent.h tiêu đề là crossplatform (đối với máy POSIX). Bất kỳ đề xuất.

+0

Khi tôi thấy nhiều nền tảng, tôi có xu hướng giả sử bạn có nghĩa là Windows và có thể là OS/2. :-) Câu trả lời cho chỉ Posix là dễ dàng, và ai đó đã cho nó. – Omnifarious

Trả lời

18

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

Định nghĩa dirent struct trong solaris không chứa lĩnh vực d_type. Bạn sẽ cần phải thực hiện những thay đổi như sau

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

thay đổi

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

Kể từ stat cũng là tiêu chuẩn POSIX nó nên được nhiều cross-platform. Nhưng bạn có thể muốn sử dụng if ((s.st_mode & S_IFMT) == S_IFDIR) để tuân theo tiêu chuẩn.

+9

Thực ra POSIX định nghĩa một macro cho điều này: 'if (S_ISDIR (s.st_mode))'. Tất nhiên, bạn nên kiểm tra xem 'stat()' có thành công trước không. – mark4o

+0

Lưu ý rằng fstatat (2) có thể thích hợp hơn stat (2), vì 'de-> d_name' liên quan đến thư mục mở. – Igor

Các vấn đề liên quan