Frage Wie man den Dateinamen von FILE * struct in C bekommt


Ist es möglich, den Namen einer Datei in C abzurufen? Wenn eine Datei wie folgt erstellt wird:

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

Und die "foo.txt" kommt von einer Variablen außerhalb des Geltungsbereichs. Gibt es eine Möglichkeit, es aus der FILE-Struktur abzurufen?


5
2017-11-02 23:51


Ursprung


Antworten:


Sie kippen Tatsächlich rufen Sie die Dateinamen von Ihrem ab FILE Objekte.

Wenn der Name jedoch an fopen ist wichtig für Sie, und diese Variable ist aus irgendeinem Grund außerhalb des Geltungsbereichs, Sie könnten immer ein FILE* in einer Struktur, dh.

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

Zumindest würde ich das tun, aber es hängt davon ab, was Sie eigentlich machen wollen.


8
2017-11-02 23:59



Leider ist auf vielen Systemen ein Dateiname nur ein Zeiger auf einen Inode. Und wenn diese Dateisysteme feste Links unterstützen, bedeutet das, dass es mehrere Dateinamen pro realer Datei gibt. Außerdem können Sie eine Datei öffnen und dann die Datei entfernen. In diesem Fall wäre nicht einmal ein Dateiname, sondern nur ein Deskriptor vorhanden. Aus diesen Gründen können Sie nicht von einem Dateideskriptor zu einem Dateinamen wechseln.


8
2017-11-02 23:56



Es ist nicht möglich, den Dateinamen aus a zu erhalten FILE Griff. Sie sollten den Dateinamen selbst speichern, wenn Sie ihn später benötigen.


6
2017-11-02 23:53



Schon seit FILE Objekte können aus Dingen erstellt werden, denen kein Name zugeordnet ist (insbesondere aus einem Raw - Dateideskriptor mit fdopen()), sie haben nicht immer einen Namen zu bekommen.


6
2017-11-02 23:54



Im Allgemeinen ist es nicht möglich. Der nächste, den Sie unter Linux ausprobieren können, ist:

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

Wiederverwendung buf wie das ist schrecklich hässlich, aber soweit ich das beurteilen kann, ist es legal und nicht undefiniert Verhalten pro POSIX.


5
2017-11-03 03:02