2011-11-02 12 views
5

E 'possibile recuperare il nome di un file in C? Se un file viene creato come la seguente:Come ottenere il nome di un file da FILE * struct in C

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

E il "foo.txt" deriva da una variabile fuori del campo di applicazione. C'è un modo per recuperarlo dalla struttura FILE?

risposta

8

È impossibile recuperare i nomi di file dagli oggetti FILE.

Tuttavia, se il nome è passato alla fopen è importante per voi, e quella variabile è fuori portata per qualsiasi motivo, si può sempre avvolgere un FILE* in una struct, vale a dire.

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

Almeno questo è quello che farei, ma dipende da ciò che stai effettivamente cercando di fare.

+1

Questo è quello che finirò per fare. Grazie! – rahmu

6

La sua non è possibile ottenere il nome del file da un manico FILE. È necessario memorizzare il nome del file da soli se in seguito sarà necessario utilizzarlo.

6

Poiché gli oggetti FILE possono essere creati da elementi a cui non è associato alcun nome (in particolare, da un descrittore di file non elaborato con fdopen()), non sempre hanno un nome da ottenere.

8

Purtroppo, su molti sistemi il nome del file è solo un puntatore a un inode. E se quei filesystem supportano i collegamenti fisici, significa che ci sono più nomi di file per file reale. Inoltre, è possibile aprire un file e quindi rimuovere il file, nel qual caso non ci sarebbe stato anche un nome di file, solo un descrittore. Per questi motivi, non è possibile passare da un descrittore di file a un nome di file.

5

In generale, non è possibile. Il più vicino si può provare, su Linux, è:

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

Riusare buf così è terribilmente brutta, ma per quanto posso dire, è un comportamento indefinito legale e non a POSIX.

Problemi correlati