2010-02-04 12 views
13

है के क्रॉस मंच रास्ता वर्तमान में मैं जैसे कुछ कोड है (गाढ़ा और जाँच त्रुटि का एक समूह निकाला गया):परीक्षण है कि क्या एक फ़ाइल एक निर्देशिका

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

यह मेरी Linux मशीन पर कामयाबी से काम करता है। हालांकि एक और मशीन पर (SunOS, स्पार्क की तरह दिखता है):

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

मैं संकलन समय पर निम्न त्रुटि मिलती है:

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

मैंने सोचा था कि dirent.h हैडर पार मंच था (इसे POSIX मशीनों के लिए)। कोई सुझाव।

+0

जब मैं क्रॉस-प्लेटफॉर्म देखता हूं, तो मुझे लगता है कि आप विंडोज और संभवतः ओएस/2 का मतलब मानते हैं। :-) पॉज़िक्स का उत्तर आसान है, और किसी ने इसे पहले ही दिया है। – Omnifarious

उत्तर

18

रेफरी http://www.nexenta.org/os/Porting_Codefixes:

सोलारिस में struct dirent परिभाषा d_type क्षेत्र शामिल नहीं है। आप के रूप में

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

को

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

परिवर्तन इस प्रकार के बाद से stat भी POSIX मानक इसे और अधिक पार मंच होना चाहिए परिवर्तन करने के लिए की आवश्यकता होगी। लेकिन आप मानक का पालन करने के लिए if ((s.st_mode & S_IFMT) == S_IFDIR) का उपयोग करना चाह सकते हैं।

+9

वास्तव में POSIX इसके लिए एक मैक्रो परिभाषित करता है: 'अगर (S_ISDIR (s.st_mode)) '। बेशक आपको यह जांचना चाहिए कि 'stat() 'पहले सफल है। – mark4o

+0

ध्यान दें कि fstatat (2) stat (2) पर अधिक बेहतर हो सकता है, क्योंकि 'de-> d_name' खुली निर्देशिका के सापेक्ष है। – Igor

संबंधित मुद्दे