Pertanyaan Mendapatkan jalur absolut dari file


Bagaimana saya bisa mengubah jalur relatif ke jalur absolut dalam C di Unix? Apakah ada fungsi sistem yang nyaman untuk ini?

Di Windows ada a GetFullPathName fungsi yang melakukan pekerjaan itu, tetapi saya tidak menemukan sesuatu yang serupa di Unix ...


32
2017-10-23 08:53


asal


Jawaban:


Menggunakan realpath ().

Itu realpath() fungsi akan diturunkan,   dari pathname yang ditunjuk oleh    file_name, nama path absolut itu   nama file yang sama, yang resolusinya   tidak melibatkan '.','..', atau   tautan simbolis. Nama path yang dihasilkan   harus disimpan sebagai null-dihentikan   string, hingga maksimum {PATH_MAX}   byte, dalam buffer yang ditunjukkan oleh    resolved_name.

Jika resolved_name adalah penunjuk null,   perilaku realpath() aku s   implementasi yang ditentukan.


Contoh berikut menghasilkan   pathname absolut untuk file   diidentifikasi oleh symlinkpath   argumen. Nama path yang dihasilkan adalah   disimpan di lintasan realpath.

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


ptr = realpath(symlinkpath, actualpath);

43
2017-10-23 09:03



Coba juga "getcwd"

#include <unistd.h>

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

Hasil:

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

Lingkungan pengujian:

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
2017-12-18 19:40