stdioFILE *
ポインターが与えられた場合、(開いた)ファイルの名前を見つける方法はありますか?
3 に答える
( hereから) POSIX システムでは、fileno() を使用して FILE* からファイル記述子を取得し、次に fstat を使用してファイル記述子から統計情報を取得できるようです。stat 構造体には、デバイス番号と inode 番号が含まれています。inode に一致するファイルのファイルシステムを確認できます。ファイルシステムがいっぱいになると、明らかに時間がかかります。
これが実際には不可能な理由 (リンクされた記事で説明されているように) は、ストリームが stdin や stdout のようなものである場合、または削除された開いているファイルである場合、ストリームにファイル名を持たせないことができるためです。ハードリンクのため、複数の名前を持つこともできます。
リンクされた記事では、この comp.lang.c FAQに言及しており、この問題の不溶性について簡単に概説しています。
編集:訂正していただきありがとうございます。
いいえ、ありません。他のものとは別に、FILE * は名前付きファイルを参照することはできません。アプリケーションでこの機能が必要な場合は、開いている FILE * からそれらを開くために使用したファイル名へのある種のマップを維持する必要があります。
標準で定義されたポータブル ソリューションはありません。ただし、OS が提供する API セットを確認することはできます。POSIX システムには、fstat
( ではなく) 記述子を受け取り、FILE *
何らかの情報を返す関数があります。