2009-05-06 4 views
3

Gibt es eine Methode, mit der ich den Namen der (geöffneten) Datei ermitteln kann, wenn ich einen Zeiger auf stdio FILE * habe?Ermitteln des (geöffneten) Dateinamens aus einer Datei *

+0

Ein Dateideskriptor ist eine Ganzzahl, die sich von einer FILE * unterscheidet. Ich nehme an, Sie wollen die Antwort in Bezug auf Datei *, aber Sie möchten vielleicht Ihren Titel bearbeiten. – mkb

Antwort

8

Es sieht (von here) aus, dass Sie auf POSIX-Systemen fileno() verwenden können, um den Dateideskriptor aus einer FILE * abzurufen, und verwenden Sie dann fstat, um die Statistikinformationen aus dem Dateideskriptor abzurufen. Die Stat-Struktur enthält die Gerätenummer und die Inode-Nummer. Sie können das Dateisystem nach Dateien durchsuchen, die dem Inode entsprechen. Dies wird natürlich einige Zeit in Anspruch nehmen, bis ein Dateisystem voll ist.

Der Grund, dass dies nicht wirklich möglich ist (wie im verknüpften Artikel erläutert) ist, dass ein Stream keinen Dateinamen haben kann, wenn es etwa stdin oder stdout ist, oder wenn es eine geöffnete Datei ist, die gelöscht wurde. Es kann mehrere Namen auch wegen hardlinks haben.

Der verlinkte Artikel erwähnt this comp.lang.c FAQ, die die Unlöslichkeit dieses Problems kurz umreißt.

EDIT: Danke für die Korrektur.

+0

Danke für mehr als nur die Antwort "Nein, du kannst nicht". – Jamie

+1

fstat() beschreibt die Datei, die der Dateideskriptor geöffnet hat. Sie verwenden fileno(), um den Dateideskriptor aus dem Dateizeiger abzurufen. Beachten Sie, dass der Inode möglicherweise nicht gefunden wird oder dass mehrere mögliche Namen für die Datei vorhanden sind (abhängig von der Anzahl der Hardlinks). –

2

Nein, gibt es nicht. Abgesehen von allem anderen darf sich FILE * nicht auf eine benannte Datei beziehen. Wenn Ihre Anwendung diese Funktion benötigt, müssen Sie eine Art Karte von offenen FILE * s zu dem Dateinamen pflegen, den Sie verwendet haben, um sie zu öffnen.

1

Es gibt keine definierte tragbare Standardlösung. Sie können jedoch einen Blick auf das von Ihrem Betriebssystem bereitgestellte API-Set werfen. POSIX-Systeme haben eine fstat-Funktion, die einen Deskriptor (keine FILE *) nimmt und einige Informationen zurückgibt.