2011-02-28 9 views
61

¿Existe la posibilidad de obtener el nombre del archivo desde el identificador del archivo? ¿O cómo puedo eliminar el archivo que tiene solo un identificador?Obtención de nombre de archivo (o eliminación de archivo) utilizando el identificador de archivo

+1

No creo que sea posible. Sin embargo, me encantaría tener una solución. – BoltClock

+0

Lo dudo, también. –

+0

Me encantaría tener al menos la posibilidad de convertir el recurso en el nombre del archivo. –

Respuesta

110

Hay stream_get_meta_data. Funciona para una transmisión que obtienes de tmpfile(). Si lo llama en un puntero de archivo normal, entonces es posible que solo obtenga el nombre base.

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

Ejemplo para tmpfile():

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

Ejemplo para fopen ("somefile", "r"):

"test" 
+4

¡Esto funciona! No sé cómo esto no surgió como la respuesta aceptada, y todos aquí dicen que esto es imposible. También funciona en Windows. – rsk82

+1

Gracias por esto, parece una cosa tan simple, pero resulta ser un dolor de cabeza ... También puedes/debes usar 'realpath' para obtener el archivo completo. –

3

Para lograr esto, deberá crear un contenedor que almacene el nombre del archivo. Un identificador de archivo no tiene contexto del nombre del archivo desde el que se creó.

+0

Para ver un ejemplo de este enfoque, consulte [esta respuesta SO] (http://stackoverflow.com/a/30985867/2908724). – bishop

+0

php .... vamos ... smh – ahnbizcad

8

Nyes. Afaik no hay ninguna función en PHP para eso directamente. Pero en Linux, se puede hacer

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

Esto no se ha probado por lo que podría necesitar ajustes.

EDITAR Al parecer, no es un simpler solution.

+0

Esta es la única forma en que puedo pensar en hacerlo, excepto para realizar el 'find' dentro de PHP, aunque probablemente sería más lento. – Orbling

-4

un método limpio de usar archivo temporal:

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

sin necesidad de cerrar el archivo tmp, lo hará borrarse mientras termina php.

+1

¿En serio lo llamas un "método limpio"? – xZero

Cuestiones relacionadas