是否有任何C API从Linux的完整路径中提取基本文件名?

341*_*008 13 c linux

给定完整路径,API应该给我基本文件名.例如,"/ foo/bar.txt" - >"bar.txt".

Fed*_*oca 10

basename().

用路径(以a的形式char*)提供它,它将以另一个的形式返回基本名称(即所需文件/目录的名称)char*.

编辑:

我忘了告诉你POSIX版本basename()修改了它的参数.如果你想避免这种情况,你可以basename()在你的源代码中使用GNU版本:

#define _GNU_SOURCE
#include <string.h>
Run Code Online (Sandbox Code Playgroud)

作为交换,这个版本basename()将返回一个空字符串,如果你用它来提供,例如/usr/bin/由于斜杠.

  • 在将其提供给basename()之前,先对路径进行限制. (2认同)

Mat*_*ner 6

#include <string.h>

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

  • 不要忘记释放新分配的缓冲区:"man strdup"说:"使用malloc(3)获取新字符串的内存,并且可以使用free(3)"释放.在"else"之后删除":". (4认同)

Nic*_*ght 5

你想要basename(),它应该存在于几乎任何POSIX-ish系统中:

http://www.opengroup.org/onlinepubs/000095399/functions/basename.html

#include <stdio.h>
#include <libgen.h>

int main() {
  char name[] = "/foo/bar.txt";
  printf("%s\n", basename(name));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

...

$ gcc test.c
$ ./a.out
bar.txt
$ 
Run Code Online (Sandbox Code Playgroud)

  • basename是破坏性的,在这种情况下会导致段错误,请尝试`basename("/ foo/bar /")`. (3认同)