2012-06-27 7 views
6

संभव डुप्लिकेट:
Getting Filename from file descriptor in C
Obtain filename from file pointer in Cफ़ाइल सूचक के बाद मुझे फ़ाइल नाम कैसे मिल सकता है?

मैं एक समारोह यहां है:

handle_file(FILE *file) 
{ 
    if(condition) 
    { 
     print filename and other msg; 
    } 
} 

केवल एक चीज है कि हम यहाँ पता फाइल करने के लिए एक सूचक है; क्या सूचक के अनुसार फ़ाइल नाम प्राप्त करना संभव है?

+1

मुझे विश्वास है कि यह संभव नहीं है। आपको फ़ाइल नाम का अलग-अलग ट्रैक रखना चाहिए। –

+0

संभव नहीं है। वैसे भी [इसे जांचें] (http://stackoverflow.com/questions/9937645/obtain-filename-from-file-pointer-in-c) – tuxuday

+0

क्या ऑपरेटिंग सिस्टम? – hmjd

उत्तर

15

चेक बाहर this answer फ़ाइल वर्णनकर्ता और this answer प्राप्त करने के लिए फ़ाइल वर्णनकर्ता से फ़ाइल नाम पाने के लिए। लिनक्स पर ठीक होना चाहिए (अन्य ऑपरेटिंग सिस्टम के बारे में निश्चित नहीं है)।

यहां एक त्वरित काम कर उदाहरण (Cygwin/Win7 के तहत परीक्षण किया) है:

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

int main() 
{ 
    int MAXSIZE = 0xFFF; 
    char proclnk[0xFFF]; 
    char filename[0xFFF]; 
    FILE *fp; 
    int fno; 
    ssize_t r; 

    // test.txt created earlier 
    fp = fopen("test.txt", "r"); 
    if (fp != NULL) 
    { 
     fno = fileno(fp); 
     sprintf(proclnk, "/proc/self/fd/%d", fno); 
     r = readlink(proclnk, filename, MAXSIZE); 
     if (r < 0) 
     { 
      printf("failed to readlink\n"); 
      exit(1); 
     } 
     filename[r] = '\0'; 
     printf("fp -> fno -> filename: %p -> %d -> %s\n", 
       fp, fno, filename); 
    } 
    return 0; 
} 

आउटपुट:

fp -> fno -> filename: 0x80010294 -> 3 -> /tmp/test.txt 
+1

+1: सहायक पाता है। मैंने पठनीयता में सुधार के लिए थोड़ा सा जवाब दिया। –

+0

मैंने कोशिश की है, बहुत अच्छी तरह से काम करता है सिवाय इसके कि यह फ़ाइल नाम के बाद प्रिंट/proc/self/fd/xxx प्रिंट करेगा। – nzomkxia

+0

इस टिप्पणी के बारे में क्या: "आप 'proclink' का उपयोग/proc/self/fd/NNN पर कर सकते हैं जहां एनएनएन फाइल डिस्क्रिप्टर है"?क्या आपने रीडलिंक की कोशिश की है? – bcelary

0

जैसा कि मैंने खोजा है, अगर आप जड़ हैं और lsof कमान अपने सिस्टम में ही अस्तित्व में है , तो आप उद्घाटन फ़ाइल, lsof -d descriptor के वर्णनकर्ता प्राप्त करने के लिए fileno(fp) का उपयोग कर सकते हैं। आप इसे आज़मा सकते हैं।

-2

मुझे लगता है कि यह संभव है।
वर्णनकर्ता प्राप्त करने के लिए fileno(fp) का उपयोग करें।
फिर, आप fstat() फ़ंक्शन का उपयोग कर सकते हैं।

The fstat() function shall obtain information about an open file asso‐ 
     ciated with the file descriptor fildes, and shall write it to the area 
     pointed to by buf. 

int fstat(int fildes, struct stat *buf);

तो, आप अपने *buf में फ़ाइल जानकारी का एक बहुत कुछ मिल सकता है।

+2

fstat द्वारा लौटाई गई संरचना में फ़ाइल का नाम नहीं है। Http://linux.die.net/man/2/fstat देखें। – bcelary

-1

अन्यथा आप किसी फ़ोल्डर में सभी निर्देशिकाओं और फ़ाइलों का विश्लेषण करना चाहते हैं तो आप opendir और struct dirent का उपयोग कर सकते हैं। यह फ़ाइल पॉइंटर का उपयोग नहीं कर रहा है, लेकिन आपके कोड के काम के तरीके के आधार पर आपके लिए उपयोगी हो सकता है।

DIR *BaseDIR; 
struct dirent *curentDir; 
BaseDIR = opendir("path/to/the/directory"); 
while((curentDir = readdir(BaseDIR)) != NULL){ 
     printf("directory or file name : %s\n",curentDir->d_name); 
} 
closedir(BaseDIR); 
2

यह 2 चरणों में किया जा सकता है। सबसे पहले, आपको फ़ाइल डिस्क्रिप्टर प्राप्त करने की आवश्यकता होगी, फिर आपको फ़ाइल नाम पुनर्प्राप्त करने की आवश्यकता होगी। निम्नलिखित एक उदाहरण है, लेकिन कुछ गंभीर बफर ओवरफ्लो भेद्यताएं हैं!

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

char * recover_filename(FILE * f) { 
    int fd; 
    char fd_path[255]; 
    char * filename = malloc(255); 
    ssize_t n; 

    fd = fileno(f); 
    sprintf(fd_path, "/proc/self/fd/%d", fd); 
    n = readlink(fd_path, filename, 255); 
    if (n < 0) 
     return NULL; 
    filename[n] = '\0'; 
    return filename; 
} 
+0

ओपनबीएसडी के बारे में क्या? – user2284570

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

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