Getting filename (or deleting file) using file handle
Asked Answered
S

4

79

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

Seline answered 28/2, 2011 at 16:21 Comment(8)
I don't think it's possible. Would love to have a solution though.Romona
I would love to have at least possibility to cast resource to filename.Seline
It's kinda weird 'cause you need the filename in order to set the handler, right?Adala
@ts: With the flick of a magic wand, poof!Romona
@Alfabravo: Not all PHP functions make handles using filenames.Romona
@Romona Never said so. But IN THIS CASE, setting a file handler requires the filename. Right?Adala
if you use tmpfile() it returns a file handle - but you have no idea what the filename is!!!Affix
isn't it ridiculous how PHP doesn't provide this obvious basic functionality, and you have to do multiline shennanigans?Hyrax
S
150

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"
Suboceanic answered 7/10, 2011 at 17:27 Comment(3)
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.Woodall
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.Undirected
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.Overcast
Q
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.

Quincentenary answered 28/2, 2011 at 16:36 Comment(1)
This is the only way I can think of doing it, save for performing the find within PHP, though that would probably be slower.Rema
C
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.

Cuirassier answered 28/2, 2011 at 16:29 Comment(1)
For an example of this approach, see this SO answer.Herophilus
R
-5

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.

Regularize answered 23/11, 2011 at 2:49 Comment(1)
You seriously call this a "clean method" ?Tanjatanjore

© 2022 - 2024 — McMap. All rights reserved.