Извлечь имя файла из полного пути в C, используя MSVS2005 - PullRequest
3 голосов
/ 05 мая 2011

В программе на C у меня есть путь к файлу в строке (в частности, это имя exe, хранящееся в argv[0]). Я хотел бы извлечь имя файла и отбросить путь к каталогу, используя MS Visual Studio 2005. Любая встроенная функция для этого?

Ответы [ 4 ]

4 голосов
/ 05 мая 2011

Не совсем, просто найдите последнюю обратную косую черту в пути.Все, что после этого, является именем файла.Если после этого ничего не происходит, путь указывает имя каталога.

// Returns filename portion of the given path
// Returns empty string if path is directory
char *GetFileName(const char *path)
{
    char *filename = strrchr(path, '\\');
    if (filename == NULL)
        filename = path;
    else
        filename++;
    return filename;
}
3 голосов
/ 05 мая 2011

Для справки вот код, который я реализовал, предположительно совместимый с Win / Unix:

    char *pfile;
    pfile = argv[0] + strlen(argv[0]);
    for (; pfile > argv[0]; pfile--)
    {
        if ((*pfile == '\\') || (*pfile == '/'))
        {
            pfile++;
            break;
        }
    }
2 голосов
/ 19 марта 2013

Если вам нужна функция из libc:

#include <unistd.h>

char * basename (const char *fname);
1 голос
/ 24 сентября 2016

Это версия для бедняка:

char *p, *s = args[0]; // or any source pathname
...
p = strchr(s, '\\'); // find the 1st occurence of '\\' or '/'
// if found repeat the process (if not, s already has the string)
while(p) {
  s = ++p; // shift forward s first, right after '\\' or '/'
  p = strchr(p, '\\'); // let p do the search again
}
// s now point to filename.ext
...

примечание: для _TCHAR используйте _tcschr вместо strchr

strchr похож на: while((*p) && (*p != '\\')) p++; с безопасным поясом NULL возврат, если chr не найден. Так что, если вам действительно не нравится зависеть от другой библиотеки, вы можете использовать это:

char *p, *s = args[0];
...
p = s; // assign to s to p
while(*p && (*p != '\\')) p++;
while(*p) { // here we have to peek at char value
  s = ++p;
  while (*p && (*p != '\\')) p++;
}
// s now point to filename.ext
...

Если ниже, используйте asm вместо ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...