Учитывая полный путь, API должен дать мне имя базового файла. Например, "/foo/bar.txt" → "bar.txt".
Существуют ли API-интерфейсы C для извлечения базового имени файла из полного пути в Linux?
Ответ 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); } }