2009-06-24 12 views
20

में एक यूनिक्स निर्देशिका और फ़ाइल के बीच अंतर करें पथ, कहें,/home/shree/path/def, मुझे यह निर्धारित करना है कि def एक निर्देशिका या फ़ाइल है या नहीं। क्या सी या सी ++ कोड में इसे प्राप्त करने का कोई तरीका है?सी और सी ++

उत्तर

35

निम्नलिखित कोड फ़ाइल पर जानकारी प्राप्त करने के लिए stat() फ़ंक्शन और S_ISDIR ('एक निर्देशिका है') और S_ISREG ('एक नियमित फ़ाइल है) मैक्रोज़ का उपयोग करता है। बाकी सिर्फ एक पूर्ण संकलन योग्य कार्यक्रम बनाने के लिए त्रुटि जांचने और पर्याप्त है।

#include <stdio.h> 
#include <errno.h> 
#include <sys/stat.h> 

int main (int argc, char *argv[]) { 
    int status; 
    struct stat st_buf; 

    // Ensure argument passed. 

    if (argc != 2) { 
     printf ("Usage: progName <fileSpec>\n"); 
     printf ("  where <fileSpec> is the file to check.\n"); 
     return 1; 
    } 

    // Get the status of the file system object. 

    status = stat (argv[1], &st_buf); 
    if (status != 0) { 
     printf ("Error, errno = %d\n", errno); 
     return 1; 
    } 

    // Tell us what it is then exit. 

    if (S_ISREG (st_buf.st_mode)) { 
     printf ("%s is a regular file.\n", argv[1]); 
    } 
    if (S_ISDIR (st_buf.st_mode)) { 
     printf ("%s is a directory.\n", argv[1]); 
    } 

    return 0; 
} 

नमूना रन यहां दिए गए हैं:


pax> vi progName.c ; gcc -o progName progName.c ; ./progName 
Usage: progName 
     where is the file to check. 

pax> ./progName /home 
/home is a directory. 

pax> ./progName .profile 
.profile is a regular file. 

pax> ./progName /no_such_file 
Error, errno = 2 
+0

त्रुटि कोड की जांच के कारण आपका कोड थोड़ा बोझिल है। मैं इसे हटाने का सुझाव देता हूं और कुछ टिप्पणी जोड़ता हूं जैसे "त्रुटियों की जांच करें: फ़ाइल मौजूद नहीं है, पर्याप्त तर्क नहीं है"। मुझे लगता है कि यह आपके उत्तर को थोड़ा बेहतर बना देगा –

+3

मैं इसे त्रुटि जांच के साथ पसंद करता हूं, क्योंकि इसे अक्सर उदाहरणों से बाहर रखा जाता है और लोगों को यह नहीं पता कि इसे वापस कैसे रखा जाए। –

+1

मैंने इसे छोड़ दिया है, लेकिन टेक्स्ट में स्पष्ट किया गया है कि महत्वपूर्ण बिट्स क्या हैं। – paxdiablo

9

स्टेट (2) सिस्टम कॉल का उपयोग करें। यह देखने के लिए कि क्या दिया गया पथ एक फ़ाइल या निर्देशिका है, आप st_mode फ़ील्ड पर S_ISREG या S_ISDIR मैक्रो का उपयोग कर सकते हैं। मैन पेज आपको अन्य सभी क्षेत्रों के बारे में बताता है।

-1

वैकल्पिक रूप से आप का निर्माण किया शेल कमांड "परीक्षण" में साथ प्रणाली() फ़ंक्शन का उपयोग कर सकते हैं।
प्रणाली रिटर्न आदेश के निकास स्थिति पिछले निष्पादित

 
string test1 = "test -e filename" ; 
if(!system(test1)) 
printf("filename exists") ; 

string test2 = "test -d filename" ; 
if(!system(test2)) 
    printf("filename is a directory") ; 

string test3 = "test -f filename" ; 
if(!system(test3)) 
    printf("filename is a normal file") ; 

लेकिन मुझे डर है कि यह केवल लिनक्स पर काम करेगा हूँ ..

+2

समस्याग्रस्त अगर फ़ाइल नाम में व्हाइटस्पेस है, तो मुझे लगता है कि आपको इसे बचाना होगा। – Paggas

+3

हालांकि यह काम करेगा, प्रदर्शन वांछित होने के लिए बहुत छोड़ देगा। सिस्टम() के लिए प्रत्येक कॉल कांटा जाएगा और फिर आदेश की व्याख्या करने के लिए एक नया खोल निष्पादित करेगा। –

5

के बारे में क्या बढ़ावा :: फाइल सिस्टम पुस्तकालय और उसके is_directory (स्थिरांक पथ का उपयोग कर & पी)? परिचित होने में कुछ समय लग सकता है, लेकिन इतना नहीं। यह शायद निवेश के लायक है, और आपका कोड मंच विशिष्ट नहीं होगा।