名称

basename,dirname-解析路径名组件

语法

#include <libgen.h>

char *dirname(char *path);

char *basename(char *path);

返回值

dirname()和basename()都返回指向以null终止的字符串的指针。 (不要将这些指针传递给free(3)。)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

BUGS

在glibc实现中,这些函数的POSIX版本会修改path参数,并在使用诸如" / usr /"之类的静态字符串调用时进行segfault。

在glibc 2.2.1之前,dirname()的glibc版本未正确处理带有尾随aq / aq字符的路径名,如果给定NULL参数,则会生成段错误。

示例

以下代码片段演示了basename()和dirname()的用法:

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);

说明

警告:有两个不同的函数basename()-参见下文。

函数dirname()和basename()将以null终止的路径名字符串分成目录和文件名组件。在通常情况下,dirname()返回直到但不包括最终aq / aq的字符串,而basename()返回最终aq / aq之后的组件。结尾的aq / aq字符不算作路径名的一部分。

如果path不包含斜杠,则dirname()返回字符串"。"而basename()返回path的副本。如果path是字符串" /",则dirname()和basename()都返回字符串" /"。如果path是空指针或指向空字符串,则dirname()和basename()均返回字符串"。"。

dirname()返回的字符串," /"和basename()返回的字符串连接起来,会得到一个完整的路径名。

dirname()和basename()都可以修改path的内容,因此在调用这些函数之一时可能希望传递副本。

这些函数可以将指针返回到静态分配的内存,该内存可能被后续调用覆盖。或者,它们可以将指针返回到路径的某个部分,以便在不再需要函数返回的指针之前,不应修改或释放路径所指的字符串。

以下示例列表(取自SUSv2)显示了dirname()和basename()返回的不同路径的字符串:

路径dirnamebasename / usr / lib / usrlib / usr / / usr usr .usr // 。 .. .. ...
BASENAME - Linux手册页

Linux程序员手册 第3部分
更新日期: 2020-06-09

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
basename(),dirname()Thread safetyMT-Safe

另外参见

basename(1),dirname(1)

备注

basename()有两种不同的版本-上面描述的POSIX版本和GNU版本,其中一种

    #define _GNU_SOURCE         /* See feature_test_macros(7) */
    #include <string.h>

GNU版本从不修改其参数,并且当path带有斜杠时,尤其是当它是" /"时,返回空字符串。没有dirname()的GNU版本。

使用glibc时,如果包含,则会获取POSIX版本的basename(),否则获取GNU版本。

遵循规范

POSIX.1-2001,POSIX.1-2008。

日期:2019-08-20 18:00:07 来源:oir作者:oir