77

Is there a possibility to obtain filename from file handle? Or how can I delete file having only a handle?

BoltClock
  • 700,868
  • 160
  • 1,392
  • 1,356
ts.
  • 10,510
  • 7
  • 47
  • 73

4 Answers4

148

There is stream_get_meta_data. It works for a stream that you get from tmpfile(). If you call it on a regular file pointer then you might only get the basename.

$meta_data = stream_get_meta_data($stream_or_file_pointer);
$filename = $meta_data["uri"];
echo $filename;

Example for tmpfile():

"/private/var/folders/v3/n54x13jx5v7610fw9dm0wcxm0000gn/T/phpCJvevP"

Example for fopen("somefile", "r"):

"test"
lion.vollnhals
  • 1,762
  • 1
  • 11
  • 5
  • 4
    This works! I don't know how this didn't came up as the accepted answer, and everyone here say that this is impossible. Works on Windows too. – rsk82 Nov 06 '11 at 21:51
  • 3
    Thanks for this, seems like such a simple thing, but turns out to be such a headache ... You can/should also use `realpath` to get the full filepath. – Wayne Weibel Dec 04 '13 at 20:08
  • Thank you Wayne Weibel. `realpath` is what I was looking for. I came to this page looking for a way to determine the filename in the same case as it exists in the filesystem. – Dale Thompson Aug 09 '23 at 02:37
8

Nyes. Afaik there is no function in PHP to that directly. But on Linux, you can do

$fp = fopen('somefile', 'r');
$stat = fstat($fp);
$inode = $stat['ino'];
system("find -inum $inode", $result);
echo $result;

This is untested so it might need tweaking.

EDIT Apparently, there is a simpler solution.

Community
  • 1
  • 1
Gordon
  • 312,688
  • 75
  • 539
  • 559
  • This is the only way I can think of doing it, save for performing the `find` within PHP, though that would probably be slower. – Orbling Feb 28 '11 at 16:41
3

To achieve this, you will need to create a wrapper that stores the file name. A file handle has no context of the filename it was created from.

Greg
  • 21,235
  • 17
  • 84
  • 107
  • For an example of this approach, see [this SO answer](http://stackoverflow.com/a/30985867/2908724). – bishop Jun 22 '15 at 17:24
-4

A clean method to use temporary file:

<?
$tmp=array_search('uri', @array_flip(stream_get_meta_data($GLOBALS[mt_rand()]=tmpfile())));
file_put_contents($tmp, 'hello');
echo file_get_contents($tmp);
?>

without need to fclose the tmp file, it will be deleted while the php ends.

diyism
  • 12,477
  • 5
  • 46
  • 46