2009-05-06 5 views
3

Étant donné un pointeur stdio FILE *, existe-t-il une méthode permettant de connaître le nom du fichier (ouvert)?Détermination du nom de fichier (ouvert) à partir d'un fichier *

+0

Un descripteur de fichier est un entier, ce qui est différent d'un FICHIER *. Je suppose que vous voulez la réponse en termes de FICHIER *, mais vous voudrez peut-être modifier votre titre. – mkb

Répondre

8

Il semble (à partir de here) que sur les systèmes POSIX vous pouvez utiliser fileno() pour obtenir le descripteur de fichier à partir d'un FICHIER *, puis utiliser fstat pour obtenir les informations statistiques du descripteur de fichier. La structure statistique contient le numéro de périphérique et le numéro d'inode. Vous pouvez vérifier le système de fichiers pour les fichiers qui correspondent à l'inode. Cela prendra évidemment du temps pour un système de fichiers plein de choses.

La raison pour laquelle cela n'est pas vraiment possible (comme expliqué dans l'article lié) est qu'un flux ne peut avoir aucun nom de fichier s'il est quelque chose comme stdin ou stdout, ou s'il s'agit d'un fichier ouvert supprimé. Il peut avoir plusieurs noms à cause de liens physiques.

L'article lié mentionne this comp.lang.c FAQ qui résume l'insolubilité de ce problème en bref.

EDIT: Merci pour la correction.

+0

Merci pour plus que la réponse "non vous ne pouvez pas". – Jamie

+1

fstat() est utilisé pour décrire le fichier que le descripteur de fichier a ouvert. Vous utilisez fileno() pour obtenir le descripteur de fichier à partir du pointeur de fichier. Notez que l'inode peut ne pas être trouvé, ou qu'il peut y avoir plusieurs noms possibles pour le fichier (selon le nombre de liens durs). –

2

Non, il n'y en a pas. En dehors de toute autre chose, le FICHIER * peut ne pas faire référence à un fichier nommé. Si votre application a besoin de cette fonctionnalité, vous devrez conserver une sorte de carte depuis les fichiers ouverts vers le nom de fichier que vous avez utilisé pour les ouvrir.

1

Il n'existe pas de solution portable définie par défaut. Cependant, vous pouvez jeter un coup d'œil à l'ensemble d'API fourni par votre système d'exploitation. Les systèmes POSIX ont une fonction fstat qui prend un descripteur (pas un FILE *) et renvoie des informations.

Questions connexes