Получение абсолютного пути к файлу - PullRequest
36 голосов
/ 23 октября 2008

Как я могу преобразовать относительный путь в абсолютный путь в C в Unix? Есть ли для этого удобная системная функция?

В Windows есть функция GetFullPathName, которая выполняет эту работу, но я не нашел ничего похожего в Unix ...

Ответы [ 4 ]

46 голосов
/ 23 октября 2008

Использовать realpath () .

Функция realpath() должна получить, из пути, на который указывает file_name, абсолютный путь, который называет тот же файл, разрешение которого не включает '.', '..' или символические ссылки. Сгенерированный путь должны быть сохранены как завершенные нулем строка, максимум до {PATH_MAX} байт, в буфере, указанном resolved_name.

Если resolved_name - нулевой указатель, поведение realpath() является реализации.


В следующем примере создается абсолютный путь к файлу идентифицируется по символической ссылке аргумент. Сгенерированный путь хранится в массиве actualpath.

#include <stdlib.h>
...
char *symlinkpath = "/tmp/symlink/file";
char actualpath [PATH_MAX+1];
char *ptr;


ptr = realpath(symlinkpath, actualpath);
0 голосов
/ 03 марта 2019

Существует также небольшая библиотека путей cwalk , которая работает кроссплатформенно. Для этого у него есть cwk_path_get_absolute :

#include <cwalk.h>
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  char buffer[FILENAME_MAX];

  cwk_path_get_absolute("/hello/there", "./world", buffer, sizeof(buffer));
  printf("The absolute path is: %s", buffer);

  return EXIT_SUCCESS;
}

Выходы:

The absolute path is: /hello/there/world
0 голосов
/ 17 декабря 2018

Попробуйте realpath() в stdlib.h

char filename[] = "../../../../data/000000.jpg";
char* path = realpath(filename, NULL);
if(path == NULL){
    printf("cannot find file with name[%s]\n", filename);
} else{
    printf("path[%s]\n", path);
    free(path);
}
0 голосов
/ 18 декабря 2016

Также попробуйте "getcwd"

#include <unistd.h>

char cwd[100000];
getcwd(cwd, sizeof(cwd));
std::cout << "Absolute path: "<< cwd << "/" << __FILE__ << std::endl;

Результат:

Absolute path: /media/setivolkylany/WorkDisk/Programming/Sources/MichailFlenov/main.cpp

Среда тестирования:

setivolkylany@localhost$/ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 8.6 (jessie)
Release:    8.6
Codename:   jessie
setivolkylany@localhost$/ uname -a
Linux localhost 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2 (2016-10-19) x86_64 GNU/Linux
setivolkylany@localhost$/ g++ --version
g++ (Debian 4.9.2-10) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
...