在Linux中有没有C API可以从完整路径中提取基本文件名?

16

接收到完整路径后,API 应该返回基本文件名。例如, "/foo/bar.txt" --> "bar.txt"。

4个回答

11

有一个basename()函数。

将路径(以char*形式表示)作为参数传递给它,它将返回另一个char*形式的基本名称(即您想要的文件/目录的名称)。

编辑:

我忘了告诉你,POSIX版本的basename()会修改其参数。如果您想避免这种情况,可以在源代码中添加GNU版本的basename()

#define _GNU_SOURCE
#include <string.h>

在这个版本的basename()中,如果你传入例如/usr/bin/这样以斜杠结尾的路径,它会返回一个空字符串。


3
在将路径传递给basename()之前,复制该路径以防止数据被篡改。 - 341008
如果我没错的话,include 应该是 <libgen.h> - S3DEV

8
#include <string.h>

char *basename(char const *path)
{
    char *s = strrchr(path, '/');
    if (!s)
        return strdup(path);
    else
        return strdup(s + 1);
}

4
别忘了释放新分配的缓冲区:"man strdup" 说:"用 malloc(3) 获取新字符串的内存,可以用 free(3) 释放它。" 在 "else" 后面移除 ":"。 - Antonio Rizzo

5

3
basename命令会造成破坏,并在此情况下导致段错误,请尝试使用basename("/foo/bar/") - falstro
@roe:实际上,在这种情况下它可能会发生段错误。在我的情况下,没问题 :) 但你是对的,已经修复了。 - Nicholas Knight
是的,当然。抱歉,我的意思是在你的情况下它可能会导致段错误,假设字符串字面值是一些编译时宏或其他东西。整个重点是它可能是具有破坏性的,你被迫复制你的字符串。 - falstro

0
我认为@matt-joiner的正确C代码应该是:
char *basename(char const *path)
{
        char *s = strrchr(path, '/');
        if(s==NULL) {
                return strdup(path);
        } else {
                return strdup(s + 1);
        }
}

!s是惯用的C代码,相比之下s==NULL是多余的。 - syockit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接