PHP. Как получить имя файла по открытому file handle

Проблема. Есть функция, которая генерирует некоторое имя файла, записывает его в базу и выполняет
return fopen($filename);

И вот возникла задачка, как по возвращенному хендлеру получить имя открытого файла. Я адекватного способа сделать это средствами PHP не нашел.

PS. Да, вопрос носит сугубо теоретический характер, проблему я скорее всего решу переписыванием функции, чтобы она возвращала кроме хендлера еще и имя.
  • Вопрос задан
  • 3320 просмотров
Пригласить эксперта
Ответы на вопрос 4
Gesper
@Gesper Автор вопроса
Сам вопрос задал, сам и отвечу. Пришлось покопаться в мануалах, но ответ нашелся.
fopen возвращает ресурс типа stream. А среди функций работающих с потоками нашлась функция stream_get_meta_data, которая возвращает ассоциативный массив. В этом массиве есть параметр uri, который и содержит искомое имя файла, с которым ассоциирован наш хендлер.
Ответ написан
lafayette
@lafayette
Насколько я знаю, это невозможно.
Ответ написан
Комментировать
@immaculate
Программист-путешественник
В Unix системах файл и его имя — различные сущности, поэтому невозможно. Точнее, можно обойти все дерево каталогов, начиная с /, и искать имя, которое соответствует inode, но это совершенно неоптимальное решение.
Ответ написан
Комментировать
alexxxst
@alexxxst
Можно в линуксе так:

/proc/PID/fd/@FD — это ссылка на ваш файл, например вот:

root@in:/# ps aux | grep nginx
root      3267  0.0  0.0  28724   824 ?        Ss   Sep22   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf# 
...
root@in:/# cd /proc/3267/fd
root@in:/proc/3267/fd# ls -l
l-wx------ 1 root root 64 2010-12-02 14:52 2 -> /var/log/nginx/error.log
...

2 — здесь — дескриптор файла числовой, сразу видно, на какой файл он указывает…

В PHP не пробовал, но в консоли это легко.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы