7

在这里引用手册

函数 dirname() 和 basename() 将一个以 null 结尾的路径名字符串分解为目录和文件名组件。在通常情况下,dirname() 返回字符串直到但不包括最后的 '/',而 basename() 返回最后的 '/' 之后的组件。尾随 '/' 字符不计入路径名的一部分。

稍后,你有这张小桌子:

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?

所以..有人明白这里发生了什么吗?

4

2 回答 2

15

尾随 '/' 字符不计入路径名的一部分。

因此“/usr/”和“/usr”是一样的,它可能表示一个文件或目录,在目录中具有名称(目录条目命名usr/。该函数dirname返回路径的父目录。的父目录/usr/. 似乎完全一致。

于 2012-12-10T16:42:05.223 回答
4

目录也是文件。 usr当然是文件的基本名称/usr。这完全遵循手册 - 在 中/usr,根-/是最终的/usr是它后面的内容,因此是基本名称。

至于/usr/v. /usr,我怀疑这是因为决赛/总是被吞下,这是在其他地方指定的,或者属于“通常情况下”的限定。否则/usr////usr///////////将指代完全不同的实体......

于 2012-12-10T16:37:53.653 回答