2008-10-23 22 views
29

Come posso convertire un percorso relativo in un percorso assoluto in C su Unix? Esiste una comoda funzione di sistema per questo?Ottenere il percorso assoluto di un file

In Windows esiste una funzione GetFullPathName che fa il lavoro, ma non ho trovato qualcosa di simile su Unix ...

risposta

42

Usa realpath().

La funzione realpath() deve derivare, dal percorso puntato da file_name, un percorso assoluto che nomi lo stesso file, la cui risoluzione non comporta '.', '..', o collegamenti simbolici . Il percorso generato deve essere memorizzato come stringa con terminazione nullo, fino ad un massimo di byte nel buffer indicato da resolved_name.

Se resolved_name è un puntatore nullo, il comportamento di realpath() è implementazione definita.


Il seguente esempio genera un percorso assoluto per il file identificato dalla argomento symlinkpath. Il nome del percorso generato è memorizzato nell'array actualpath.

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


ptr = realpath(symlinkpath, actualpath); 
+7

L' 'più uno' non è necessario, thuogh esso non farà alcun danno. –

+2

'GetFullPathName' su Windows funziona anche per file inesistenti. 'realpath' richiede il percorso per esistere. Questo tipo di schifo quando si desidera creare un percorso o un file. – Joakim

0

provare anche "getcwd"

#include <unistd.h> 

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

Risultato:

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

ambiente di test:

[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. 
Problemi correlati