Существуют ли какие-либо C API для извлечения имени базового файла из его полного пути в Linux? - PullRequest
13 голосов
/ 20 июля 2010

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

Ответы [ 4 ]

10 голосов
/ 20 июля 2010

Там basename () .

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

EDIT:

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

#define _GNU_SOURCE
#include <string.h>

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

6 голосов
/ 20 июля 2010
#include <string.h>

char *basename(char const *path)
{
    char *s = strrchr(path, '/');
    if (!s)
        return strdup(path);
    else:
        return strdup(s + 1);
}
5 голосов
/ 20 июля 2010

Вы хотите 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
$ 
0 голосов
/ 30 января 2013

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

char *basename(char const *path)
{
        char *s = strrchr(path, '/');
        if(s==NULL) {
                return strdup(path);
        } else {
                return strdup(s + 1);
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...