2008-10-23 50 views
29

Làm cách nào tôi có thể chuyển đổi đường dẫn tương đối thành đường dẫn tuyệt đối trong C trên Unix? Có chức năng hệ thống thuận tiện cho việc này không?Nhận đường dẫn tuyệt đối của tệp

Trên Windows có một chức năng GetFullPathName rằng hiện công việc, nhưng tôi đã không tìm thấy một cái gì đó tương tự như trên Unix ...

Trả lời

42

Sử dụng realpath().

Chức năng realpath() sẽ lấy được, từ tên đường dẫn trỏ đến bởi file_name, một tên đường dẫn tuyệt đối rằng tên cùng một tập tin, có độ phân giải không liên quan đến '.', '..', hoặc liên kết tượng trưng . Tên đường dẫn được tạo phải được lưu trữ dưới dạng chuỗi vô hiệu hóa, tối đa là {PATH_MAX} byte, trong bộ đệm được trỏ đến bởi resolved_name.

Nếu resolved_name là một con trỏ rỗng, hành vi của realpath() là được xác định thực hiện.


Ví dụ sau tạo ra một tên đường dẫn tuyệt đối cho file xác định bởi các symlinkpath tranh cãi. Đường dẫn được tạo là được lưu trữ trong mảng đường dẫn thực.

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


ptr = realpath(symlinkpath, actualpath); 
+7

Các 'một cộng' là không cần thiết, thuogh nó sẽ không làm hại gì cả. –

+2

'GetFullPathName' trên Windows hoạt động cho các tệp không tồn tại. 'realpath' yêu cầu đường dẫn tồn tại. Đây là loại hút khi bạn muốn tạo một đường dẫn hoặc tập tin. – Joakim

0

Cũng thử "getcwd"

#include <unistd.h> 

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

Kết quả:

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

Kiểm tra môi trường:

[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. 
Các vấn đề liên quan