2011-02-01 15 views
12

संभव डुप्लिकेट:
Getting Filename from file descriptor in Cक्या फ़ाइल नाम 'फ़ाइल * से प्राप्त करने का कोई तरीका है?

वहाँ एक सरल और (यथोचित) पोर्टेबल एक FILE* से फ़ाइल नाम होने का तरीका है?

मैं f = fopen(filename, ...) का उपयोग कर एक फ़ाइल खोलता हूं और फिर f को कई अन्य कार्यों में भेजता हूं, जिनमें से कुछ एक त्रुटि की रिपोर्ट कर सकते हैं। मैं त्रुटि संदेश में फ़ाइल नाम की रिपोर्ट करना चाहता हूं लेकिन अतिरिक्त पैरामीटर को पार करने से बचें।

मैं एक कस्टम रैपर struct { FILE *f, const char *name } बना सकता हूं, लेकिन क्या शायद एक आसान तरीका है? (FILE*fopen का उपयोग करके खोला नहीं गया था, मुझे परिणाम की परवाह नहीं है।)

+0

डुप्लिकेट http://stackoverflow.com/questions/1188757/getting-filename-from-file-descriptor-in-c –

+1

कोई मानक तरीका जो मुझे पता है; 'फ्रीपेन' आपको पढ़ने/लिखने, और बाइनरी/सामान्य मोड को बदलने देगा, लेकिन यदि आप अपना स्वयं का नाम चाहते हैं (एक त्रुटि संदेश प्रिंट करने के लिए कहें) तो आप भाग्य से बाहर हैं। – dmckee

+0

चूंकि आप एक ऐसे सिस्टम का उपयोग कर रहे हैं जिसमें फ़ाइल संरचना है, मुझे संदेह है कि "एक अतिरिक्त पैरामीटर के आसपास गुजरना" भी एक मुद्दा है? इसे पास करने के लिए आपका कारण क्या है? प्रदर्शन? – Lundin

उत्तर

12

कुछ प्लेटफार्मों पर (जैसे लिनक्स), आप, /proc/self/fd/<number> के लिंक को पढ़ कर यह लाने के लिए इतनी के रूप में सक्षम हो सकता है:

#include <stdio.h> 
#include <unistd.h> 
#include <string.h> 

int main(void) 
{ 
    char path[1024]; 
    char result[1024]; 

    /* Open a file, get the file descriptor. */ 
    FILE *f = fopen("/etc/passwd", "r"); 
    int fd = fileno(f); 

    /* Read out the link to our file descriptor. */ 
    sprintf(path, "/proc/self/fd/%d", fd); 
    memset(result, 0, sizeof(result)); 
    readlink(path, result, sizeof(result)-1); 

    /* Print the result. */ 
    printf("%s\n", result); 
} 

यह मेरे सिस्टम पर, वांछित के रूप में /etc/passwd प्रिंट करेगा।

+0

और यह अज्ञात पाइप पर क्या प्रिंट करता है? – dmckee

+0

@ डीएमकी: 'पाइप: []' – intelfx

2

यह थोड़ा मुश्किल है, क्योंकि एक फ़ाइल * एक फ़ाइल हैंडल से पढ़/लिख सकती है जो नामित फ़ाइल से जुड़ी नहीं है बिल्कुल (उदाहरण के लिए एक अनाम पाइप या सॉकेट)। आप फ़ाइलनो हैंडल को fileno() के साथ प्राप्त कर सकते हैं और फिर फ़ाइल नाम के बारे में जानने के लिए सिस्टम विशिष्ट तरीके हैं। यहाँ कैसे लिनक्स के तहत यह करने के लिए पर एक चर्चा है:

Getting Filename from file descriptor in C

और Windows के तहत इस बहुत आसान नहीं है या तो:

http://msdn.microsoft.com/en-us/library/aa366789(VS.85).aspx (के रूप में यहाँ एक अतिरिक्त कदम है, तो आप _get_osfhandle का उपयोग() प्राप्त करने के लिए सी लाइब्रेरी फ़ाइल वर्णनकर्ता से Windows फ़ाइल हैंडल)

संबंधित मुद्दे

 संबंधित मुद्दे