Сведения о вопросе

CPdeveloper

17:31, 24th August, 2020

Теги

PHP    

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

Просмотров: 370   Ответов: 4

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

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

PS. Да, вопрос носит сугубо теоретический характер, проблему я скорее всего решу переписыванием функции, чтобы она возвращала кроме хендлера еще и имя.



  Сведения об ответе

piter

14:08, 28th August, 2020

Сам вопрос задал, сам и отвечу. Пришлось покопаться в мануалах, но ответ нашелся.
fopen возвращает ресурс типа stream. А среди функций работающих с потоками нашлась функция stream_get_meta_data, которая возвращает ассоциативный массив. В этом массиве есть параметр uri, который и содержит искомое имя файла, с которым ассоциирован наш хендлер.


  Сведения об ответе

pumpa

03:16, 13th August, 2020

Насколько я знаю, это невозможно.


  Сведения об ответе

qwerty101

06:27, 18th August, 2020

В Unix системах файл и его имя — различные сущности, поэтому невозможно. Точнее, можно обойти все дерево каталогов, начиная с /, и искать имя, которое соответствует inode, но это совершенно неоптимальное решение.


  Сведения об ответе

screen

03:00, 26th August, 2020

Можно в линуксе так:

/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 не пробовал, но в консоли это легко.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться