使用文件句柄获取文件名(或删除文件)


69

是否有可能从文件句柄获取文件名?或者如何删除仅具有句柄的文件?


1
我认为不可能。希望有一个解决方案。
BoltClock

我希望至少有将资源转换为文件名的可能性。
ts。

1
@ts:用魔杖轻弹,po!
BoltClock

1
@Alfabravo:并非所有的PHP函数都使用文件名来处理句柄。
BoltClock

1
如果使用tmpfile(),它将返回文件句柄-但您不知道文件名是什么!!!
HenchHacker 2012年

Answers:


136

stream_get_meta_data。它适用于从tmpfile()获得的流。如果在常规文件指针上调用它,则可能只会得到基本名称。

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

tmpfile()的示例:

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

fopen(“ somefile”,“ r”)的示例:

"test"

4
这可行!我不知道这不是作为公认的答案出现的,这里的每个人都说这是不可能的。也可以在Windows上使用。
rsk82

1
谢谢,这似乎很简单,但是却令人头疼...您可以/应该也可以使用它realpath来获取完整的文件路径。
韦恩·韦伯

8

是的 Afaik在PHP中没有直接的功能。但是在Linux上,您可以

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

这未经测试,因此可能需要调整。

编辑显然,有一个简单的解决方案


这是我能想到的唯一方法,除了find在PHP中执行外,尽管这可能会更慢。
2011年

3

为此,您将需要创建一个存储文件名的包装器。文件句柄没有创建它的文件名的上下文。


有关此方法的示例,请参见此SO答案
主教

-4

一种使用临时文件的干净方法:

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

无需关闭tmp文件,它将在php结束时被删除。


5
您是否将其称为“清洁方法”?
xZero
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.