2010-02-26 6 views
12

Comment obtenir le chemin absolu pour un chemin relatif donné par programme sous Linux?Comment obtenir le chemin absolu pour un chemin relatif donné par programme sous Linux?

Incase de Windows, nous avons l'API _fullpath(). En d'autres termes, je veux dire ce qui est API analogue à _fullpath de Windows dans Linux?

+0

Depuis cela a été marqué avec 'C', ce qui est probablement un double de http://stackoverflow.com/questions/229012/getting-absolute- path-of-a-file – bfontaine

Répondre

14

Comme mentionné Paul, utilisez realpath(). S'il vous plaît noter cependant que, puisque de nombreux systèmes de fichiers dans Linux support hard links, n'importe quel répertoire donné peut avoir un certain nombre de chemins absolus différents.

+0

Tout fichier donné peut, à coup sûr. Les liens physiques vers les répertoires ne sont pas nécessairement pris en charge. Les liens symboliques provoquent également une certaine confusion quand il s'agit de déterminer le "vrai" chemin. – Vatine

+0

@unwind, Merci pour l'info. Si en raison de liens durs, si un répertoire donné résout plusieurs chemins absolus différents, quel sera le comportement de l'API realpath? – Jay

+4

Les liens physiques vers les répertoires sont considérés comme malfaisants et interdits par la plupart des systèmes de fichiers. –

6

Essayez realpath:

$ man realpath 

Ceci est également disponible dans BSD, OS X, et al.

3

Il est le realpath de stdlib.h

+2

J'ai tout de suite pensé à realpath, mais j'ai été stupéfait * - * stupéfait * Je dis - quand j'ai vu votre réponse montrant que 'realpath' est dans' stdlib.h'. Sûrement que * ne peut pas * être vrai, étant donné que 'realpath' ne fait pas partie de la bibliothèque C. Et voilà, c'est vrai. Je suis abasourdi. Qu'est-ce qu'un programme bien formé qui définit sa propre fonction nommée 'realpath' à faire? Ces gars POSIX ont couru! * Amok * Je dis! –

+0

Dan: Tant qu'ils invoquent leur compilateur en mode "strictement conforme" et ne définissent pas de macros qui invoquent un comportement indéfini (comme '_XOPEN_SOURCE'), ils devraient être OK. – caf

13

Vérifiez la fonction realpath.

#include <stdlib.h> 
#include <stdio.h> 
#include <linux/limits.h> 
int main() 
{ 
     char resolved_path[PATH_MAX]; 
     realpath("../../", resolved_path); 
     printf("\n%s\n",resolved_path); 
     return 0; 
} 
+0

Veuillez utiliser PATH_MAX au lieu de 100 – Speed8ump

+2

Ce code est non sécurisé et buggé, comme indiqué ci-dessus. Do ** not ** donne un tampon aussi petit à 'realpath' qui écrira très probablement au-delà de la taille de la mémoire tampon (puisqu'elle nécessite * une longueur de PATH_MAX). Même si le programme ne plante pas, ce code peut entraîner des failles de sécurité en fonction de la disposition des variables, si un adversaire peut contrôler le chemin d'origine à résoudre. Le manuel recommande de passer NULL comme deuxième paramètre et laisser 'realpath' allouer de la mémoire pour éviter les problèmes avec les définitions PATH_MAX, en commençant par POSIX 2008. –

+0

Je pense qu'il est bon de toujours se rappeler que PATH_MAX n'est tout simplement pas: http://insanecoding.blogspot.com.br/2007/11/pathmax-simply-isnt.html –

0

Le est aussi une autre façon utile, comme « readlink -m $ filename »

Tout d'abord, il fonctionne sans exigence pour le fichier cible existe. Deuxièmement, il va gérer les liens symboliques et obtenir un chemin vraiment réel.

1

En cours d'exécution sur RedHat 5.3, realpath n'existe pas mais readlink est installé. Vous pouvez l'utiliser sur les chemins relatifs et les liens symboliques, et il résoudra les liens symboliques récursivement pour vous. Il est donc une meilleure option que realpath à mon avis

 
readlink -f . 
-1
// For C++ with Gnome Gtkmm3 libraries 
#include <glibmm.h> 
#include <giomm.h> 

    string PathRel2Abs(string relpath) { 
    Glib::RefPtr<Gio::File> file = Gio::File::create_for_path(relpath); 
    return file->get_path(); 
} 
+1

Habituellement, c'est une bonne idée d'ajouter quelques explications à votre message sur la façon dont le code fonctionne. Cela aide les développeurs les plus récents à savoir ce que fait le code. –

+0

Et ce n'est même pas C. –

Questions connexes