Arch manual pages

DIRNAME(3) Linux Programmer's Manual DIRNAME(3)

dirname, basename - 解析路徑組成部分

#include <libgen.h>

char *dirname(char *path);
char *basename(char *path);

dirnamebasename 把 以 null 結尾 的 路徑名 分解爲 目錄 和 文件名. 一般情況下, dirname 返回 路徑名 的 前面部分, 直到 (但不包括) 最後一個 '/', 而 basename 則 返回 最後一個 '/' 後面 的 內容. 如果 路徑名 以 '/' 結尾, 該 '/' 被認爲 不是 路徑名 的 一部分.

如果 路徑名 path 不包含 斜槓 '/', dirname 返回 字符串 ".", 而 basename 返回 path 的 副本. 如果 路徑名 path 是 "/", 則 dirnamebasename 均 返回 "/". 如果 路徑名 path 是 NULL 指針 或 指向 空串, 則 dirnamebasename 均 返回 ".".

dirname 返回的 字符串, "/", 和 basename 返回的 字符串 連接 起來, 能夠 產生 一個 完整 的 路徑名.

無論 dirname 還是 basename 都 有可能 更改 path 的 內容, 因此 如果 需要 保護 原有 路徑名, 應該 傳送 副本 作爲 參數. 此外, dirnamebasename 返回的 指針 可能 指向 一塊 靜態分配 的 內存, 會被 下次 調用 覆蓋.

下面 的 例子 (摘自 SUSv2) 展示了 對於 不同的 路徑名, dirnamebasename 返回 的 字符串:

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

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);
free(dirc);
free(basec);

dirnamebasename 均 返回 以 null 結尾的 字符串 的 指針.

在 glibc 的 各個 版本 中, 直到 (幷包括) 2.2.1, dirname 無法 正確 處理 以 '/' 字符 結尾 的 路徑名. 如果 參數 是 NULL 指針, 他 還會 產生 段衝突 (segmentation violation).

SUSv2

dirname(1), basename(1)

徐明 <xuming@users.sourceforge.net>

2003/05/13

http://cmpp.linuxforum.net

本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃:https://github.com/man-pages-zh/manpages-zh
2000-12-14 GNU