2012-06-14 29 views
13

Làm cách nào để xác định đường dẫn tuyệt đối của tệp hoặc thư mục từ đường dẫn tương đối đã cho trong C/C++ trên GNU/Linux?
Tôi biết về realpath(), nhưng nó không hoạt động trên các tệp không tồn tại.Làm thế nào để có được đường dẫn tuyệt đối của tập tin hoặc thư mục, có * không * tồn tại?

Giả sử người dùng nhập ../non-existant-directory/file.txt và thư mục làm việc của chương trình là /home/user/.
Điều tôi cần là hàm trả về /home/non-existant-directory/file.txt.

Tôi cần chức năng này để kiểm tra xem đường dẫn cụ thể có nằm trong một thư mục con nhất định hay không.

+0

Tôi không nghĩ rằng bất cứ điều gì như thế này tồn tại được xây dựng trong. Bạn sẽ phải tự viết mã. –

Trả lời

10

Hãy thử realpath. Nếu nó không thành công, bắt đầu loại bỏ các thành phần đường dẫn từ một kết thúc tại một thời điểm và thử lại realpath cho đến khi thành công. Sau đó, thêm các thành phần bạn đã xóa trở lại vào kết quả của cuộc gọi thành công realpath.

Nếu bạn chắc chắn thư mục chứa tồn tại và bạn chỉ muốn tạo tệp ở đó, bạn chỉ phải xóa tối đa một thành phần.

Một cách tiếp cận khác sẽ chỉ là tạo tệp trước, sau đó gọi realpath.

+0

giải pháp đầu tiên hoạt động, cảm ơn! –

0

Bạn có thể nhận được thư mục hiện hành và áp dụng logic sau đây:

Nếu đường dẫn bắt đầu với "/", thay thế các thư mục hiện hành với gốc

Đối với mỗi thư mục được đề cập trên đường dẫn tương đối thực hiện như sau:

  • Nếu bạn ở phần cuối cùng của đường dẫn tương đối, hãy nối nó vào đường dẫn và dừng của thư mục hiện tại: đường dẫn của thư mục hiện tại là đường dẫn tuyệt đối.

  • Nếu không: Kiểm tra xem thư mục đó có tồn tại trong thư mục hiện tại hay không.

  • Nếu nó không tồn tại, nhưng không phải là một thư mục, lỗi tín hiệu (trừ mục cuối cùng trong đường dẫn)

  • Nếu nó không tồn tại và nó là một thư mục, xem nếu nó là một liên kết tượng trưng (trên các hệ điều hành hỗ trợ tính năng này). Nếu có, hãy thay thế thư mục hiện tại bằng thư mục được trỏ tới của liên kết tượng trưng.

  • Nếu nó không tồn tại, và nó là một thư mục, nhưng không phải là một liên kết tượng trưng, ​​thêm thư mục này vào đường dẫn thư mục hiện hành (tức là thay thế các thư mục hiện hành với các thư mục con kiểm tra)

  • Nếu không tồn tại, gắn thêm các phần còn lại của đường dẫn tương đối vào đường dẫn của thư mục hiện tại và dừng lại.

+2

Điều này chủ yếu là reimplementing 'realpath' chính mình và nhiều công việc nhiều hơn bạn cần phải làm. –