2012-12-10 12 views
6

यहाँ the manual हवाला देते हुए:dirname(): मैनुअल गलत है?

कार्यों dirname() और basename() निर्देशिका और फ़ाइल नाम घटकों में एक अशक्त-समाप्त पथ स्ट्रिंग टूट गया। सामान्य मामले में, dirname() स्ट्रिंग को वापस देता है, लेकिन अंतिम '/', और बेसनाम() अंतिम '/' के बाद घटक देता है। ट्रेलिंग '/' वर्ण पथनाम के हिस्से के रूप में नहीं गिने जाते हैं।

और बाद में, आप इस छोटे से टेबल है:

path   dirname basename 
"/usr/lib" "/usr" "lib" 
"/usr/"  "/"  "usr"  // wat? 
"usr"   "."  "usr" 
"/"   "/"  "/" 
"."   "."  "." 
".."   "."  ".." 

dirname("/usr/") क्यों लौटा रहा है "/" और नहीं "/usr"?
मैनुअल में वाक्य मुझे बताता है कि मुझे परिणामस्वरूप /usr मिलना चाहिए।
मैंने एक डमी प्रोग्राम में वास्तविक परिणाम का परीक्षण किया और यह मैन्युअल कहता है जैसे व्यवहार करता है।

#include <libgen.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main(int argc, char const *argv[]) 
{ 
    const char *mydir="/usr/"; 
    char *dummy = strdup(mydir); 
    char *dummy2 = strdup(mydir); 

    char *dname = dirname(dummy); 
    char *bname = basename(dummy2); 


    printf("mydir: '%s', dname: '%s', bname: '%s'\n", mydir, dname, bname); 

    free(dummy); 
    free(dummy2); 

    return 0; 
} 


$ ./test 
mydir: '/usr/', dname: '/', bname: 'usr' 

अब, मैं क्या होगा उम्मीद करेंगे:

path   dirname basename 
"/usr/"  "/usr"  ""  // more consistent? 

तो .. किसी को भी समझता है क्या यहाँ हो रहा है?

उत्तर

14

से पीछे चल रहे '/' वर्ण पथ के भाग के रूप में नहीं गिना जाता।

इसलिए "/ usr /" के रूप में "/ usr" है, जो एक फ़ाइल या नाम (नामक निर्देशिका प्रविष्टि) निर्देशिका / में usr के साथ एक निर्देशिका निरूपित सकता है एक ही है। फ़ंक्शन dirname पथ की मूल निर्देशिका देता है। /usr की मूल निर्देशिका / है। पूरी तरह से संगत लगता है।

+0

+1 आप प्रमुख मुद्दा मिल गया है और यह हवाला दिया। FYI करें वहाँ भी है कोई संबंधित समस्या # 612 के लिए एक ऑस्टिन समूह व्याख्या: http://austingroupbugs.net/view.php?id=612 –

4

एक निर्देशिका भी एक फ़ाइल है। usr निश्चित रूप से /usr फ़ाइल का बेसनाम है। इस मैनुअल ठीक इस प्रकार है - /usr में, root- /, अंतिम / और usr क्या यह इस प्रकार है इसलिए basename है। /usr/ v। /usr के लिए

के रूप में, मुझे लगता है इस वजह से अंतिम / हमेशा निगल लिया है और इस कहीं और निर्दिष्ट या "हमेशा की तरह मामले में" योग्यता के अंतर्गत आता है है। वरना /usr/// और /usr/////////// बेतहाशा विभिन्न संस्थाओं को उल्लेख करता है ...

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