basename
BASENAME
章节:Linux 程序员手册 (3)更新:2009-03-30
到 易美翻译 翻译 本页
名字
basename, dirname - 解析路径名的构成概要
#include <libgen.h> char *dirname(char *path); char *basename(char *path);
描述
警告:有两个不同的 basename() 函数 - 参考下面。函数 dirname() 和 basename() 把空字符结尾的字符串分隔成目录和文件名的成分。通常情况下,dirname() 返回字符串中最后 '/' 之前但不包括它在内的字串,而 basename() 返回 '/' 之后的部分。结尾的 '/' 不作为路径名来处理。
如果 path 不包含一个斜杠,dirname 返回字符串 "." 而 basename() 返回 path 的一个复本。如果 path 是字符串 "/",那么 dirname() 和 basename() 都返回字符串 "/"。如果 path是空指针或指向一个空字符串,dirname() 和 basename() 都返回字符串 "."。
连接 dirname() 返回的字符串,一个 "/",和 basename() 返回字符串可以得到完整的路径。
dirname() 和 basename() 都可能更改 path 的内容,所以在调用这些函数之前可能需要复制并使用复本。
这些函数可能返回一个在随后调用被覆盖静态分配的内存。一个可选方案是,它们可以返回指向 path 某部分的指针,因此 path 引用的字符串不应该被更改或释放直到这些函数返回的指针不再使用为止。
下面的示例列表(来自 SUNSv2)展示了 dirname() 和 basename() 返回的路径不同部分:
path dirname basename "/usr/lib" "/usr" "lib" "/usr/" "/" "usr" "usr" "." "usr" "/" "/" "/" "." "." "." ".." "." ".."
返回值
dirname() 和 basename() 都返回空字符结尾的字符串。(不要把这些指针传给 free(3)。)遵循于
POSIX.1-2001.注意
存在两个版本的 basename() - 上面描述的 POSIX 版本,以及下面讨论的 GNU 版本。#define _GNU_SOURCE /* 参考 feature_test_macros(7) */ #include <string.h>GNU 版本绝不会更改它的参数,并且当 path 有一个结尾的斜杠时返回空串,就算是"/"也是如此。没有 GNU 版本的 dirname()。
在 glibc 里,如果包含了头文件 <libgen.h> 时使用 POSIX 版本的 basename(),其它情况使用 GNU 版本。
错误
在 glibc 实现 POSIX 版本的函数时,它们更改其参数,并且在调用使用诸如 "/usr/" 一个静态字符串时会出现段错误。在 glibc 2.2.1 之前,glibc 版本的 dirname() 没有正确处理以 '/' 字符结尾的路径名,并且在参数是 NULL 产生一个段错误。示例
char *dirc, *basec, *bname, *dname; char *path = "/etc/passwd"; dirc = strdup(path); basec = strdup(path); dname = dirname(dirc); bname = basename(basec); printf("dirname=%s, basename=%s\n", dname, bname);