名 前
basename, dirname − パ ス 名 を 解 析 し て 各 部 分 を 取 り 出 す
書 式
#include <libgen.h>
char *dirname(char *path);
char *basename(char *path);
説 明
警 告 : basename() に は 異 な る バ ー ジ ョ ン が 2つ 存 在 す る 。 下 記 の 「 注 意 」 の 節 を 参 照 の こ と 。
dirname() と basename() は 、 ヌ ル で 終 端 さ れ た パ ス 名 の 文 字 列 を 、 デ ィ レ ク ト リ 部 分 ・ フ ァ イ ル 名 部 分 に 分 割 す る 。 通 常 は 、 dirname() は 最 後 の '/' ま で の 部 分 (最 後 の '/' は 含 ま な い ) を 返 し 、 basename() は 最 後 の '/' 以 降 の 部 分 を 返 す 。 文 字 列 の 末 尾 に つ い た '/' 文 字 は 、 パ ス 名 の 一 部 と は み な さ れ な い 。
path に ’/’ 文 字 が な い 場 合 は 、 dirname() は 文 字 列 "." を 返 し 、 basename() は path と 同 じ 内 容 を 返 す 。 path が 文 字 列 "/" に 等 し い 場 合 は 、 dirname() も basename() も 文 字 列 "/" を 返 す 。 path が ヌ ル ポ イ ン タ ー だ っ た り 、 空 の 文 字 列 を 指 し て い た 場 合 は 、 dirname() も basename() も 文 字 列 "." を 返 す 。
dirname() の 返 し た 文 字 列 、 "/"、 basename() の 返 し た 文 字 列 、 を 順 に 結 合 す る と 、 完 全 な パ ス 名 が 得 ら れ る 。
dirname() と basename() は 、 い ず れ も path の 内 容 を 変 更 す る こ と が あ る 。 し た が っ て 、 こ れ ら の 関 数 を 呼 び 出 す 際 に は コ ピ ー を 渡 す の が 望 ま し い 。 こ れ ら の 関 数 は 、 静 的 に 割 り 当 て ら れ た メ モ リ ー へ の ポ イ ン タ ー を 返 す こ と が あ り 、 こ れ ら の 領 域 は 後 の 関 数 呼 び 出 し で 上 書 き さ れ る か も し れ な い 。 ま た 、 こ れ ら の 関 数 は path の 一 部 分 を 指 す ポ イ ン タ ー を 返 す こ と も あ る 。 そ の た め 、 path で 参 照 さ れ る 文 字 列 は 、 関 数 が 返 す ポ イ ン タ ー が 不 要 に な る ま で は 変 更 し た り free し た り す べ き で は な い 。 以 下 の 一 連 の 例 (SUSv2 か ら 引 用 ) は 、 い ろ い ろ な path に 対 し て dirname() と basename() が 返 す 文 字 列 を 表 し た も の で あ る 。
返 り 値
dirname() と basename() は 、 い ず れ も ヌ ル で 終 端 さ れ た 文 字 列 へ の ポ イ ン タ ー を 返 す 。 (こ れ ら の ポ イ ン タ ー を free(3) に 渡 さ な い こ と 。 )
属 性
マ ル チ ス レ ッ デ ィ ン グ (pthreads(7) 参 照 ) 関 数 basename() と dirname() 関 数 は ス レ ッ ド セ ー フ で あ る 。
準 拠
POSIX.1−2001.
注 意
basename() に は 2種 類 の 異 な る バ ー ジ ョ ン が あ る 。 一 つ は す で に 説 明 し た POSIX バ ー ジ ョ ン で あ り 、 も う 一 つ は GNU バ ー ジ ョ ン で あ る 。 GNU バ ー ジ ョ ン を 使 用 す る に は 以 下 の よ う に す る 。
#define
_GNU_SOURCE /* feature_test_macros(7) 参 照
*/
#include <string.h>
GNU バ ー ジ ョ ン は 引 き 数 を 変 更 す る こ と は な く 、 path の 末 尾 が ’/’の 場 合 は 空 の 文 字 列 を 返 す 。 特 に path が "/" の 場 合 も 空 文 字 列 を 返 す 。 dirname() に は GNU バ ー ジ ョ ン は な い 。
glibc で は 、 <libgen.h> を イ ン ク ル ー ド す る と POSIX バ ー ジ ョ ン の basename() が 使 用 さ れ 、 そ れ 以 外 の 場 合 は GNU バ ー ジ ョ ン と な る 。
バ グ
glibc の POSIX バ ー ジ ョ ン の 実 装 で は 、 引 き 数 の 内 容 が 変 更 さ れ 、 引 き 数 に ("/usr/" な ど の ) 定 数 文 字 列 を 指 定 さ れ る と セ グ メ ン テ ー シ ョ ン フ ォ ー ル ト を 起 こ す 。 バ ー ジ ョ ン 2.2.1 以 前 の glibc で は 、 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);
関 連 項 目
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。