2012-12-10 15 views
6

burada the manual gerekçe:dirname() in C: el ile yanlış mı?

fonksiyonları dirname() ve basename() dizin ve dosya adı bileşenlerine boş sonlandırılmış yol adı dizesini bölünürler. Her zamanki gibi durumunda, dirname(), en son '/' 'a kadar olan diziyi döndürür, ancak basename() son'/'öğesinin ardından bileşeni döndürür. Trailing '/' karakterleri, yol adının bir parçası olarak sayılmaz.

Ve daha sonra, bu küçük tablo vardır:

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

Neden dirname("/usr/")"/" değil "/usr" dönüyor?
El kitabındaki cümle sonuç olarak /usr almam gerektiğini söyledi.
Gerçek sonucu bir kukla programda test ettim ve elkitabında olduğu gibi davranıyor.

#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' 

Şimdi, olurdu ne beklenir:

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

Yani .. Herkes anladığı burada neler oluyor?

cevap

14

Firar '/' karakteri dosya yolunun parçası olarak sayılmaz ... son derece farklı kişiler bakın olur. Dolayısıyla

"/ usr /" Dosya veya isim (adlı dizin girdisi) dizindeki / içinde usr ile bir dizin belirtmek olabilir "/ usr" ile aynıdır. dirname işlevi, yolun ana dizinini döndürür. /usr'un üst dizini /'dur. Tamamen tutarlı görünüyor.

+0

+1 anahtar noktanız var ve alıntıladı. FYI da ilgili bir sorun için bir Austin Grubu yorumlama var # 612: http://austingroupbugs.net/view.php?id=612 –

4

Dizin ayrıca bir dosyadır. usr, tabiki /usr dosya adıdır. Bu, elkitabını hassas bir şekilde izler - /, /, / ve usr izleyenleri, /usr içinde izler. v. /usr/usr/ için

olarak, nihai / hep yutulur ve bu başka bir yerde belirtilmeyen veya "olağan durumda" yeterlilik kapsamına girer çünkü bu şüpheli. Yoksa /usr/// ve /usr///////////