web-dev-qa-db-fra.com

Obtenir le chemin absolu d'un fichier

Comment convertir un chemin relatif en un chemin absolu en C sous Unix? Existe-t-il une fonction système pratique pour cela?

Sous Windows, il existe une fonction GetFullPathName qui fait le travail, mais je n'ai rien trouvé de semblable sous Unix ...

35
evgenka

Utilisez realpath () .

La fonction realpath() doit dériver, du chemin indiqué par file_name, un chemin absolu qui nomme le même fichier, dont la résolution n'implique pas '.', '..' ou liens symboliques. Le chemin généré doit être stocké en tant que chaîne, jusqu'à un maximum de {PATH_MAX} octets, dans la mémoire tampon désignée par resolved_name.

Si resolved_name est un pointeur nul, le comportement de realpath() est défini par la mise en œuvre.


L'exemple suivant génère un chemin absolu du fichier identifié par le symlinkpath argument. Le chemin généré est stocké dans le tableau actualpath.

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


ptr = realpath(symlinkpath, actualpath);
44
xsl

Essayez aussi "getcwd"

#include <unistd.h>

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

Résultat:

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

Environnement de test:

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.
1
Seti Volkylany

Essayez realpath() dans 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
Scott Yang