标准 C99 或 C11 不知道目录,这是某些操作系统 API(或它上面的某些外部库)提供的概念。
在 Linux 上,dirname(3) 手册页显示了调用 strdup(3) 的示例:
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);
(当然你应该freedirc和basec,并且上面的代码不检查strdup的失败)
您可能还需要路径的规范目录,使用realpath(3)。例如,您将编码:
char* filepath = something();
char* canpath = realpath(filepath, NULL);
if (!canpath) { perror("realpath"); exit(EXIT_FAILURE); };
// so canpath is malloc-ed
char *candir = dirname(canpath); // would modify the string in canpath
/// use candir here, e.g.
printf("canonical directory for %s is %s\n", filepath, candir);
free (canpath);
顺便说一句,glib 提供g_path_get_dirname(其结果应该是freed)。