2012-12-10 29 views
6

Trích dẫn the manual đây:dirname() trong C: là hướng dẫn sử dụng sai?

Các chức năng dirname() và basename() phá vỡ một chuỗi tên đường dẫn null-chấm dứt vào thư mục và tên file thành phần. Trong trường hợp thông thường, dirname() trả về chuỗi tối đa, nhưng không bao gồm, số '/' cuối cùng và tên cơ sở() trả về thành phần sau '/' cuối cùng. Trailing '/' các ký tự không được tính là một phần của tên đường dẫn.

Và sau này, bạn có bảng nhỏ này:

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

Tại sao dirname("/usr/") trở "/" và không "/usr"?
Câu trong sách hướng dẫn cho tôi biết tôi sẽ nhận được /usr.
Tôi đã thử nghiệm kết quả thực tế trong một chương trình giả và nó hoạt động giống như hướng dẫn nói.

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

Bây giờ, những gì tôi mong chờ sẽ là:

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

Vì vậy .. ai hiểu chuyện gì đang xảy ra ở đây?

Trả lời

14

Ký tự '/' không được tính là một phần của tên đường dẫn.

Do đó "/ usr /" cũng giống như "/ usr", mà có thể biểu thị một tập tin hoặc một thư mục với tên (entry thư mục có tên) usr trong thư mục /. Hàm dirname trả về thư mục mẹ của đường dẫn. Thư mục chính của /usr/. Có vẻ hoàn toàn nhất quán.

+0

+1 bạn có điểm chính và trích dẫn nó. FYI cũng có một diễn giải của Nhóm Austin cho một vấn đề liên quan # 612: http://austingroupbugs.net/view.php?id=612 –

4

Thư mục cũng là một tệp. usr dĩ nhiên là tên cơ sở của tệp /usr. Điều này tuân theo hướng dẫn chính xác - trong /usr, gốc- / là số /usr cuối cùng là cái theo sau nó, do đó là tên gốc.

Đối với /usr/ v. /usr, tôi nghi ngờ điều này là bởi vì / cuối cùng luôn luôn bị nuốt và điều này được chỉ định ở một nơi khác hoặc thuộc trường hợp "trong trường hợp thông thường". Hoặc khác /usr////usr/////////// sẽ đề cập đến các thực thể cực kỳ khác nhau ...

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