70 votes

Obtenir un nom de fichier (ou supprimer un fichier) en utilisant un handle de fichier

Existe-t-il une possibilité d'obtenir le nom de fichier à partir du handle du fichier ? Ou comment puis-je supprimer un fichier qui n'a qu'un identifiant ?

1 votes

Je ne pense pas que ce soit possible. Mais j'aimerais bien avoir une solution.

0 votes

J'aimerais avoir au moins la possibilité de convertir une ressource en nom de fichier.

0 votes

C'est un peu bizarre parce que vous avez besoin du nom du fichier pour définir le gestionnaire, non ?

138voto

lion.vollnhals Points 609

Il y a stream_get_meta_data . Cela fonctionne pour un flux que vous recevez de tmpfile() . Si vous l'appelez sur un pointeur de fichier ordinaire, vous risquez de n'obtenir que le nom de base.

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

Exemple pour tmpfile() :

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

Exemple pour fopen("somefile", "r") :

"test"

4 votes

Ça marche ! Je ne sais pas comment cela n'est pas apparu comme la réponse acceptée, et tout le monde ici dit que c'est impossible. Fonctionne aussi sous Windows.

2 votes

Merci pour cela, cela semble être une chose si simple, mais s'avère être un tel casse-tête ... Vous pouvez/devriez également utiliser realpath pour obtenir le chemin complet du fichier.

8voto

Gordon Points 156415

Nyes. Il n'y a pas de fonction en PHP qui permette de le faire directement. Mais sous Linux, vous pouvez faire

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

Ce système n'a pas été testé et peut donc nécessiter des ajustements.

EDITAR Apparemment, il y a est a une solution plus simple .

0 votes

C'est la seule façon de faire à laquelle je pense, à part effectuer le find dans PHP, bien que cela soit probablement plus lent.

3voto

Greg Points 8483

Pour ce faire, vous devrez créer un wrapper qui stocke le nom du fichier. Un handle de fichier n'a aucun contexte du nom de fichier à partir duquel il a été créé.

0 votes

Pour un exemple de cette approche, voir cette réponse SO .

-4voto

diyism Points 1191

Une méthode propre pour utiliser le fichier temporaire :

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

sans avoir besoin de fermer le fichier tmp, il sera supprimé à la fin du php.

5 votes

Vous appelez sérieusement cela une "méthode propre" ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X