Lister les fichiers d'un dossier en php [Résolu/Fermé]

- - Dernière réponse : neo_selen
Messages postés
168
Date d'inscription
dimanche 11 juillet 2010
Statut
Membre
Dernière intervention
29 juin 2016
- 18 déc. 2014 à 11:01
Bonjour a tous,
J'aimerai pouvoir créer un tableaux avec des noms de fichiers étant dans un dossier.
Par exemple, j'ai un dossier image et dedans j'ai
image1.jpg, image2.gif, image3.jpg etc...
et j'aimerai savoir si il est possible de créer un tableau ayant ces noms pour valeur?
Car j'ai fait deja qque recherche mais les méthodes ne recupèrent pas tout le temps les valeurs dans le meme ordre,
c'est a dire
une fois le tableau sera comme cela
image1.jpg
image2.gif
image3.jpg
mais une autre fois (comme il prend les fichiers au hasard) il sera
image2.gif
image3.jpg
image1.jpg

Mais moi j'aurai besoin de trouver une méhtode pour qu'il ait a chaque fois le meme odre..
est ce possible?

merci

Marc
Afficher la suite 

16 réponses

Meilleure réponse
Messages postés
6764
Date d'inscription
mardi 14 mai 2002
Statut
Contributeur
Dernière intervention
11 janvier 2016
869
96
Merci
salut,

je ne l'utilise pas comme cela alors je te propose ce que j'utilise :
<?php
$dirname = '../fichiers/';
$dir = opendir($dirname); 

while($file = readdir($dir)) {
	if($file != '.' && $file != '..' && !is_dir($dirname.$file))
	{
		echo '<a href="'.$dirname.$file.'">'.$file.'</a>';
	}
}

closedir($dir);
 ?>

Dire « Merci » 96

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 70397 internautes nous ont dit merci ce mois-ci

En utilisant un truc dans le genre sa marche nikel :

<?php
$dirname = './NomDuDossier/';
$dir = opendir($dirname);

while($file = readdir($dir)) {
if($file != '.' && $file != '..' && !is_dir($dirname.$file))
{
echo '- <a href="'.$dirname.$file.'">'.$file.'</a>'.'<br /><br />';
}
}

closedir($dir);
?>


suffit de remplacer "NomDuDossier" par le nom de dossier que l'on souhaite explorer !
Sinon tout simplement : une fonction opendir et une fonction scandir ...
a vous de jouer après avec foreach ;-)
la solution de Fox est la meilleure et la plus simple
neo_selen
Messages postés
168
Date d'inscription
dimanche 11 juillet 2010
Statut
Membre
Dernière intervention
29 juin 2016
12 -
c'est surtout que sa réponse est explicitée correctement :)
nul si on veut supprimer ca supprime tout en boucle a cause du foreach....donc la solution de fox n'est pas du tout la meilleure...
25
Merci
C'est bon j'ai trouvé.. la solution est:
$mydir = 'dossier/ou/sont/mes/images''; 
 if ($dir = @opendir($mydir)) 
 {
    while (($file = readdir($dir)) !== false) 
    {
      if($file != ".." && $file != ".")
       {
         $filelist[] = $file;
       }
    } 
closedir($dir);
 }
//Test a faire pour ne pas avoir d'erreur si il n'y a pas d'image dans le dossier
 if(sizeof($filelist) != '0') {
  sort($filelist);
 }



@ +
Messages postés
33
Date d'inscription
mardi 2 octobre 2007
Statut
Membre
Dernière intervention
6 août 2014
16
14
Merci
J'ai modifié quelques passages et c'est bon ça marche :

$dossier = './fichiers';
$d = dir($dossier);

while ($entry = $d->read())
{
if($entry != "." && $entry != ".."){
$lien = $dossier .' '.$entry;
$lien = str_replace('Object ', 'fichiers/', $lien);
echo '<a href="'.$lien.'">'.$entry.'</a><br>';
}
}
$d->close();

Merci quand même, ta solution est plus légère que la mienne. ;)
Si je me peux me permettre ton code est bon sauf que tu insères une petite erreur sur le lien :
$lien = $dossier .' '.$entry;

à la place c'est plutôt :

$lien = $dossier .$entry;

pour éviter un espace qui génère des erreurs de destination...
sinon ça marche niquel chrome :p
j'ai fait une include de ce php dans mon htlm, mais ça ne marche pas pourqoi ?
merci
neo_selen
Messages postés
168
Date d'inscription
dimanche 11 juillet 2010
Statut
Membre
Dernière intervention
29 juin 2016
12 -
papyjp: vérifies les chemins, essaies au mieux que les variables qui reçoivent le chemin fonctionnent enfonction de l'endroit où ce script est appelé.

il faut éviter les href="images/fichier.jpg"
si t'es dans http://tonsite.hebergeur.fr/articles/article.php
et tu appelles tes images, il cherchera http://tonsite.hebergeur.fr/articles/images/fichier.jpg
au lieu de http://tonsite.hebergeur.fr/images/fichier.jpg
préférer les href="/images/fichier.jpg"
quel que soit l'endroit où il est appelé, tu auras toujours:
http://tonsite.hebergeur.fr/images/fichier.jpg

rienqu'un slash en + change tout !
Messages postés
2503
Date d'inscription
vendredi 29 octobre 2004
Statut
Contributeur
Dernière intervention
13 février 2018
552
11
Merci
Salut,

Sur ta 1er ligne c'est

$mydir = 'dossier/ou/sont/mes/images'; 


Et non :

$mydir = 'dossier/ou/sont/mes/images''; 
3
Merci
j'ai trouvé, tu avais raison pour le copy("$origine".'/'."$fichier", "$destination".'/'."$fichier");

et l'autre problème venais de mon $donnees = fgets($fp,10); en fait il lis tomas / et l'espace n'est pas admit pour le nom d'un fichier. j'ai réduit à 6 le nombre de caractères que j'utilise pour la création du dossier. pour les étudiants qui ont un nom plus long que 6 caractères il sera coupé lors de la création de leur dossier personel mais ce n'est pas un problème. merci beaucoup du coup de main! pour ceux que ca interessera peut être un jour (j'ai avancé en utilisant ce genre de posts..):


le code fonctionnel:
<?php
$fp = fopen("/eleve/enregistrements.txt","r"); //on ouvre le fichier
$donnees = fgets($fp,6); //on récupère les 10 premiers caractères de la première ligne
fclose($fp); //on ferme le fichier

exec ("mkdir $donnees"); // on crée un dossier avec les valeurs extraites du fichier

$origine = "/eleve"; //on définit le dossier source de la copie
$destination = $donnees; //et sa destination
function copydir($origine , $destination) { //la fonction copie
$doss=opendir($origine);
$total = 0;
while ($fichier = readdir($doss)) { //on liste les fichiers du dossier
$l = array('.', '..');
if (!in_array( $fichier, $l)){
if (is_dir($origine."/".$fichier)){
$total += copydir("$origine/$fichier", "$destination/$fichier"); //on les déplace tous
} else {
copy("$origine".'/'."$fichier", "$destination".'/'."$fichier");
$total++;
}
}
}
return $total;
}
copydir ($origine , $destination) //on execute la fonction copie définie pas sa source et sa destination
?>
neo_selen
Messages postés
168
Date d'inscription
dimanche 11 juillet 2010
Statut
Membre
Dernière intervention
29 juin 2016
12 -
Et la même chose avec les balises codes que ccm nous offre gracieusement:
(faut cliquer sur la flèche à côté de BIS<>)
<?php
$fp = fopen("/eleve/enregistrements.txt","r"); //on ouvre le fichier
$donnees = fgets($fp,6); //on récupère les 10 premiers caractères de la première ligne
fclose($fp); //on ferme le fichier

exec ("mkdir $donnees"); // on crée un dossier avec les valeurs extraites du fichier

$origine = "/eleve"; //on définit le dossier source de la copie
$destination = $donnees; //et sa destination
function copydir($origine , $destination) { //la fonction copie
$doss=opendir($origine);
$total = 0;
while ($fichier = readdir($doss)) { //on liste les fichiers du dossier
$l = array('.', '..');
if (!in_array( $fichier, $l)){
if (is_dir($origine."/".$fichier)){
$total += copydir("$origine/$fichier", "$destination/$fichier"); //on les déplace tous
} else {
copy("$origine".'/'."$fichier", "$destination".'/'."$fichier");
$total++;
}
}
}
return $total;
}
copydir ($origine , $destination) //on execute la fonction copie définie pas sa source et sa destination
?>
Messages postés
33
Date d'inscription
mardi 2 octobre 2007
Statut
Membre
Dernière intervention
6 août 2014
16
2
Merci
Bonjour à tous.

J'ai un script qui permet de lister les fichiers d'un dossier (ici en l'occurrence le dossier "fichiers"). Ce qui est bizarre c'est qu'il fonctionne sur Internet mais pas en local.
En local il me retourne l'erreur suivante :

Catchable fatal error: Object of class Directory could not be converted to string in C:\wamp\www\test\index.php on line 19

A ce que j'ai lu c'est parce que je tente d'utiliser une variable en tant que chaîne de caractères, alors qu'à la base c'est un objet.
Mais à vrai dire je ne sais pas ce qu'il faut que je modifie concrètement pour remédier à ce problème.

Voici le code :

<?php

$d = dir("./fichiers");
while ($entry = $d->read())
{
if($entry != "." && $entry != ".."){
$lien = $d.' '.$entry;
$lien = str_replace('Object ', 'fichiers/', $lien);
    echo '<a href="'.$lien.'">'.$entry.'</a><br>';
	}
}

$d->close();
 ?>


La ligne 19 correspond à :
$lien = $d.' '.$entry;


Merci d'avance pour vos réponses.
2
Merci
bonjour a tous! j'ai un problème. j'ai un bout de code pour lire la première ligne d'un fichier texte et utiliser le mot qui s'y trouve pour créer une dossier à ce nom ( par ex le contenu de le première ligne de mon fichier est : tomas, je la récupère dans une variable , j'utilise cette variable pour créer un dossier thomas.) et ensuite je doit copier un fichier contenu dans un dossier /eleve (/eleve/enregistrements.txt) dans le dossier que je viens de créer. ma fonction copydir fonctionne bien généralement mais pas dans ce cas. il semblerais que $donnees (qui est la variable qui contiens le nom en première ligne, et que j'utilise pour créer le dossier) ne soit pas un argument valide pour le $destination de mon copydir..pourtant mon dossier est bien crée.c'est donc copydir qui ne fonctionne pas.toute idée sera la bienvenue..merci d'avance!

mon code:

<?php
$fp = fopen("/eleve/enregistrements.txt","r"); //on ouvre le fichier
$donnees = fgets($fp,10); //on récupère les 10 premiers caractères de la première ligne
fclose($fp); //on ferme le fichier

exec ("mkdir $donnees"); // on crée un dossier avec les valeurs extraites du fichier

$origine = "/eleve"; //on définit le dossier source de la copie
$destination = $donnees; //et sa destination
function copydir($origine , $destination) { //la fonction copie
$doss=opendir($origine);
$total = 0;
while ($fichier = readdir($doss)) { //on liste les fichiers du dossier
$l = array('.', '..');
if (!in_array( $fichier, $l)){
if (is_dir($origine."/".$fichier)){
$total += copydir("$origine/$fichier", "$destination/$fichier"); //on les déplace tous
} else {
copy("$origine/$fichier", "$destination/$fichier");
$total++;
}
}
}
return $total;
}
copydir ($origine , $destination) //on execute la fonction copie définie pas sa source et sa destination
?>
2
Merci
juste une précision l'erreur est : Warning: copy(tomas /enregistrements.txt) [function.copy]: failed to open stream: Invalid argument in I:\htdocs\page5.php on line 176

la ligne 176 est : copy("$origine/$fichier", "$destination/$fichier");
s.spark
Messages postés
2503
Date d'inscription
vendredi 29 octobre 2004
Statut
Contributeur
Dernière intervention
13 février 2018
552 -
copy($origine.'/'. $fichier, $destination.'/'.$fichier);
Messages postés
2503
Date d'inscription
vendredi 29 octobre 2004
Statut
Contributeur
Dernière intervention
13 février 2018
552
2
Merci
Faudrait être sur ce se que contiennent les variables et que les dossier et fichiers existent.
2
Merci
je fait tourner ca sur un serveur en local. j'ai crée le dossier d'origine et il contient un fichier texte qui est composé trois lignes. la première est le mot "tomas" et la fonction exec ("mkdir $donnees") me crée bien un dossier tomas à la racine du serveur mais il reste vide alors que le fichier texte devrais s'y copier. et la page affiche une erreur. l'erreur apparais dans la fonction copy alors que j'utilise la même variable que pour créer le dossier tomas. il semblerais que la variable $donnees ne peut pas être utilisée dans ce cas. mais je suis sur qu'elle contiens bien tomas et que mes fichiers et dossiers existent
2
Merci
idem pour la première solution. pour la deuxième (@copy) le message d'erreur disparais mais la copie ne s'effectue pas
à l'origine mon code pour créer le nouveau fichier étais if (!is_dir($destination)) mkdir($destination, fileperms($origine));
au lieu de exec ("mkdir $donnees")
mais j'obtenais
Warning: mkdir() [function.mkdir]: File exists in I:\htdocs\page5.php on line 169
alors que le dossier à créer n'existais pas et que la copie ne s'effectueais pas.
Messages postés
2503
Date d'inscription
vendredi 29 octobre 2004
Statut
Contributeur
Dernière intervention
13 février 2018
552
2
Merci
Essais déjà quelque chose de plus basique.


copy("fichier.txt","dossier/fichier.txt.bak");


Après passe par des variables

$fichier='fichier.txt';
$dossier='dossier/';
copy($fichier,$dossier.$fichier);


Est-ce que le fichier page5.php est dans le dossier parent de du dossier "eleve" ??
Messages postés
2503
Date d'inscription
vendredi 29 octobre 2004
Statut
Contributeur
Dernière intervention
13 février 2018
552
2
Merci
Tu peux aussi remplacer les espaces pas un underscore


$texte = strtr($texte , " ", "_");
1
Merci
merci ! malheureusement c'est toujours la même erreur ça ne change rien...je n'avais déja pas pu faire de mkdir sans passer par la commande exec. un mkdir ($donnees, 0777) me retournais une erreur (Warning: mkdir() [function.mkdir]: Invalid argument in I:\htdocs\page5.php on line 163) . Et bizarement exec ("mkdir $donnees"); fonctionne. c'est peut être le même genre de problème pour ma fonction copy?
Messages postés
2503
Date d'inscription
vendredi 29 octobre 2004
Statut
Contributeur
Dernière intervention
13 février 2018
552
1
Merci
Etre sur ça ne sert à rien, si tu par de se principe et que tu ne remets pas en cause ce que tu fais tu pourras resté bloquer sur des problèmes pendant très longtemps (et si $fichier ne contient rien ou un tableau ?).

Essais comme ça :

copy("$origine".'/'."$fichier", "$destination".'/'."$fichier");


ou comme ça :
@copy("$origine".'/'."$fichier", "$destination".'/'."$fichier");
1
Merci
Bonjour,

Je sais que cela fait un bout de temps que ce topic n'à pas été regarder mais je suis actuellement en train d'essayer de développer une application facebook en PHP en utilisant la librairies PHP facebook.

J n'ai pour l'instant rien fait et cela bug déjà.

J'ai ce message d'erreur: Catchable fatal error: Object of class Facebook could not be converted to string in /home/exo979/www/poemes/footprints/lib.php on line 4

Mon code lib.php est celui-ci:

<?php

function get_db_conn() {
$conn = mysql_connect($GLOBALS['localhost'], $GLOBALS['nom de ma BDD'], $GLOBALS['mdp de ma BDD']);
mysql_select_db($GLOBALS['app_facebook'], $conn);
return $conn;
}

function get_prints($user) {
$conn = get_db_conn();
$res = mysql_query('SELECT `from`, `to`, `time` FROM footprints WHERE `to`=' . $user . ' ORDER BY `time` DESC', $conn);
$prints = array();
while ($row = mysql_fetch_assoc($res)) {
$prints[] = $row;
}
return $prints;
}

function render_profile_action($id, $num) {
return '<fb:profile-action url="http://apps.facebook.com/footprints/?to=' . $id . '">'
. '<fb:name uid="' . $id . '" firstnameonly="true" capitalize="true"/> '
. 'has been stepped on ' . $num . ' times.'
. '</fb:profile-action>';
}

function render_profile_box($id, $prints) {
// Render the most recent 5 no matter what, and the second most recent 5
// only if the box is on the right (wide) side of the profile.
return render_prints($prints, 5) . '<fb:wide>' . render_prints(array_slice($prints, 5), 5) . '</fb:wide>'
. '<div style="clear: both;">' . render_step_link($to) . '</div>';
}

function do_step($from, $to) {
global $facebook;

$conn = get_db_conn();
mysql_query('INSERT INTO footprints SET `from`='.$from.', `time`='.time().', `to`='.$to, $conn);
$prints = get_prints($to);
try {

// Set Profile FBML
$fbml = render_profile_action($to, count($prints)) . render_profile_box($to, $prints);

// start batch operation
$facebook->api_client->begin_batch();

$facebook->api_client->profile_setFBML($fbml, $to);

// Send notification
// Notice the use of reference '&'
$result = & $facebook->api_client->notifications_send($to, ' stepped on you. ' .
'<a href="http://apps.facebook.com/footprints/">See all your Footprints</a>.');

// Publish feed story
$feed_title = '<fb:userlink uid="'.$from.'" shownetwork="false"/> stepped on <fb:name uid="'.$to.'"/>.';
$feed_body = 'Check out <a href="http://apps.facebook.com/footprints/?to='.$to.'">' .
'<fb:name uid="'.$to.'" firstnameonly="true" possessive="true"/> Footprints</a>.';
$facebook->api_client->feed_publishActionOfUser($feed_title, $feed_body);

// End batch operation. This will actually send queued API call to Facebook in
// a single HTTP request
$facebook->api_client->end_batch();

} catch (Exception $e) {
error_log($e->getMessage());
}
return $prints;
}

function render_step_link($id) {
return '<a href="http://apps.facebook.com/footprints/?to=' . $id . '">'
. 'Step on <fb:name uid="' . $id . '" firstnameonly="true"/>'
. '</a>';
}

function render_prints($prints, $max) {
$fbml = '';
$i = 0;
foreach ($prints as $post) {
$fbml .= '<fb:if-can-see uid="' . $post['from'] . '"><div style="clear: both; padding: 3px;">'
. '<fb:profile-pic style="float: left;" uid="' . $post['from'] . '" size="square"/>'
. '<fb:name uid="' . $post['from'] . '" capitalize="true"/> stepped on <fb:name uid="' . $post['to'] . '"/>'
. ' at <fb:time t="' . $post['time'] . '"/>. '
. '<br/>' . render_step_link($post['from']) . '<br/>'
. '</div></fb:if-can-see>';
if (++$i == $max) break;
}
return $fbml;
}