Существуют ли API-интерфейсы C для извлечения базового имени файла из полного пути в Linux?

Учитывая полный путь, API должен дать мне имя базового файла. Например, "/foo/bar.txt" → "bar.txt".

Ответ 1

Здесь basename().

Передайте ему путь (в форме char*) и он вернет вам базовое имя (то есть имя нужного файла/каталога) в виде другого char*.

EDIT:

Я забыл сказать вам, что версия POSIX basename() изменяет свой аргумент. Если вы хотите этого избежать, вы можете использовать версию GNU basename(), добавив это в ваш источник:

#define _GNU_SOURCE
#include <string.h>

В обмене эта версия basename() вернет пустую строку, если вы ее подаете, например. /usr/bin/ из-за конечной косой черты.

Ответ 2

#include <string.h>

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

Ответ 3

Вы хотите 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;
}

...

$ gcc test.c
$ ./a.out
bar.txt
$ 

Ответ 4

Я думаю, что правильный C-код @matt-joiner должен быть:

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