2011-11-02 30 views
5

Có thể truy xuất tên tệp trong C không? Nếu một tệp được tạo như sau:Cách lấy tên tệp từ FILE * struct trong C

 FILE *f = fopen ("foo.txt", "r"); 

Và "foo.txt" xuất phát từ một biến nằm ngoài phạm vi. Có cách nào để lấy nó từ cấu trúc FILE?

Trả lời

8

Bạn không thể thực tế truy xuất tên tệp từ các đối tượng FILE của bạn.

Tuy nhiên, nếu tên được chuyển đến fopen là quan trọng đối với bạn và biến đó nằm ngoài phạm vi vì bất kỳ lý do nào, bạn luôn có thể quấn FILE* trong cấu trúc, ví dụ:

struct file_with_name { 
    FILE *f; 
    char *name; /* OR char name[MAX] */ 
} 

Ít nhất đó là những gì tôi làm nhưng phụ thuộc vào những gì bạn đang thực sự cố gắng làm.

+1

Đó là những gì tôi sẽ làm. Cảm ơn! – rahmu

6

Không thể lấy tên tệp ra khỏi tay cầm FILE. Bạn nên tự lưu trữ tên tệp nếu sau này bạn cần sử dụng nó.

6

Vì đối tượng FILE có thể được tạo từ những thứ không có tên liên kết với chúng (cụ thể, từ bộ mô tả tệp thô với fdopen()), chúng không phải lúc nào cũng có tên.

8

Thật không may, trên nhiều hệ thống, tên tệp chỉ là con trỏ đến một inode. Và nếu những hệ thống tệp đó hỗ trợ liên kết cứng, điều đó có nghĩa là có nhiều tên tệp trên mỗi tệp thực. Ngoài ra, bạn có thể mở một tập tin và sau đó loại bỏ các tập tin trong trường hợp đó thậm chí sẽ không có một tên tập tin, chỉ là một mô tả. Vì những lý do này, bạn không thể chuyển từ bộ mô tả tệp sang tên tệp.

5

Nói chung, điều đó là không thể. Gần nhất bạn có thể thử, trên Linux, là:

char buf[PATH_MAX]; 
snprintf(buf, sizeof buf, "/proc/self/fd/%d", fileno(f)); 
readlink(buf, buf, sizeof buf); 

Dùng lại buf như thế là khủng khiếp xấu xí, nhưng như xa như tôi có thể nói, đó là quy phạm pháp luật và không hành vi undefined mỗi POSIX.

Các vấn đề liên quan