2008-10-23 7 views
29

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

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

ответ

42

Используйте realpath().

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

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


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

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


ptr = realpath(symlinkpath, actualpath); 
+7

'плюс один' не является необходимым, thuogh него не причинит никакого вреда. –

+2

'GetFullPathName' в Windows работает и для несуществующих файлов. 'realpath' требует, чтобы путь существовал. Этот вид отстой, когда вы хотите создать путь или файл. – Joakim

0

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

Тестирование среды:

[email protected]$/ lsb_release -a 
No LSB modules are available. 
Distributor ID: Debian 
Description: Debian GNU/Linux 8.6 (jessie) 
Release: 8.6 
Codename: jessie 
[email protected]$/ uname -a 
Linux localhost 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2 (2016-10-19) x86_64 GNU/Linux 
[email protected]$/ 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. 
Смежные вопросы