Вопрос

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

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

Это было полезно?

Решение

Используйте 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);

Другие советы

Попробуйте 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);
}

Также попробуйте «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.

Существует также небольшая библиотека путей. идти который работает кроссплатформенно.В нем есть 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top