Getting absolute path of a file

CUnixPathFilesystemsAbsolute

C Problem Overview


How can I convert a relative path to an absolute path in C on Unix? Is there a convenient system function for this?

On Windows there is a GetFullPathName function that does the job, but I didn't find something similar on Unix...

C Solutions


Solution 1 - C

Use realpath().

> The realpath() function shall derive, > from the pathname pointed to by > file_name, an absolute pathname that > names the same file, whose resolution > does not involve '.', '..', or > symbolic links. The generated pathname > shall be stored as a null-terminated > string, up to a maximum of {PATH_MAX} > bytes, in the buffer pointed to by > resolved_name. > > If resolved_name is a null pointer, > the behavior of realpath() is > implementation-defined.


> The following example generates an > absolute pathname for the file > identified by the symlinkpath > argument. The generated pathname is > stored in the actualpath array.

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


ptr = realpath(symlinkpath, actualpath);

Solution 2 - C

Try realpath() in 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);
}

Solution 3 - C

There is also a small path library cwalk which works cross-platform. It has cwk_path_get_absolute to do that:

#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;
}

Outputs:

The absolute path is: /hello/there/world

Solution 4 - C

Also try "getcwd"

#include <unistd.h>

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

Result:

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

Testing environment:

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionevgenkaView Question on Stackoverflow
Solution 1 - CxslView Answer on Stackoverflow
Solution 2 - CScott YangView Answer on Stackoverflow
Solution 3 - CJuliusView Answer on Stackoverflow
Solution 4 - CPADYMKOView Answer on Stackoverflow