readlink
を使用できます /proc/self/fd/NNN
に ここで、NNN はファイル記述子です。これにより、ファイルを開いたときの名前が表示されますが、それ以降にファイルが移動または削除された場合は、正確でなくなる可能性があります (ただし、Linux では名前の変更を追跡できる場合もあります)。検証するには、stat
指定されたファイル名と fstat
あなたが持っている fd、そして st_dev
を確認してください および st_ino
もちろん、すべてのファイル記述子がファイルを参照しているわけではありません。それらについては、pipe:[1538488]
などの奇妙なテキスト文字列が表示されます。 .実際のファイル名はすべて絶対パスになるため、どれがどれであるかを簡単に判断できます。さらに、他の人が指摘したように、ファイルはそれらを指す複数のハードリンクを持つことができます - これはそれが開かれたものだけを報告します。特定のファイルのすべての名前を見つけたい場合は、ファイル システム全体をトラバースするだけです。
Mac OS X でこの問題が発生しました。/proc
はありません。 仮想ファイル システムであるため、受け入れられたソリューションは機能しません。
代わりに F_GETPATH
があります fcntl
のコマンド :
F_GETPATH Get the path of the file descriptor Fildes. The argu-
ment must be a buffer of size MAXPATHLEN or greater.
したがって、ファイル記述子に関連付けられたファイルを取得するには、次のスニペットを使用できます:
#include <sys/syslimits.h>
#include <fcntl.h>
char filePath[PATH_MAX];
if (fcntl(fd, F_GETPATH, filePath) != -1)
{
// do something with the file path
}
MAXPATHLEN
がどこだったか覚えていないので PATH_MAX
と思ったら syslimits からでも問題ありません。
Windows では、GetFileInformationByHandleEx を使用して FileNameInfo を渡すと、ファイル名を取得できます。