Получение абсолютного пути к файлу

Получение абсолютного пути к файлу

23.10.2008 12:53:52 Просмотров 28 Источник

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

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

У вопроса есть решение - Посмотреть?

Ответы - Получение абсолютного пути к файлу / Getting absolute path of a file

Является ответом!
xsl

23.10.2008 01:03:08

Использование реального пути().

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

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


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

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


ptr = realpath(symlinkpath, actualpath);
https://stackoverflow.com/questions/229012/getting-absolute-path-of-a-file/229038#comment114534_229038
"Плюс один" не является необходимым, thuogh это не принесет никакого вреда.
https://stackoverflow.com/questions/229012/getting-absolute-path-of-a-file/229038#comment23431578_229038
GetFullPathNameв Windows работает и для несуществующих файлов. realpathтребует, чтобы путь существовал. Это отстой, когда вы хотите создать путь или файл.
https://stackoverflow.com/questions/229012/getting-absolute-path-of-a-file/229038#comment88614151_229038
Фактический путь содержит абсолютный путь, но что содержит ptr?
PADYMKO

18.12.2016 10:40:56

Также попробуйте "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.
https://stackoverflow.com/questions/229012/getting-absolute-path-of-a-file/41212150#comment93985450_41212150
100 тысяч за путь?! конечно, 5K достаточно? или PATH_MAX?
Scott Yang

17.12.2018 06:44:13

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

03.03.2019 06:33:39

Существует также небольшая библиотека путей 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
Закрыть X