Aller au contenu

Un remplacement pour Glob()


Sujets conseillés

Posté

bonjour

Comme Glob() ne fonctionne pas sur le serveur sur lequel se trouve un de mes sites, je cherche un remplacement; j'ai trouvé cette fonction:

 function glob_rec($pattern, $path) 
{
return explode("\n", shell_exec("find $path -name $pattern"));
}

mais il me manque une explication pour la faire fonctionner.

En effet, je ne sais manifestement pas exprimer $path, ne connaissant pas le langage Shell; j'ai essayé et cherché mais sans trouver jusqu'ici.

Pour le répertoire où se trouve la page contenant la fonction, j'ai essayé $files = glob_rec("*.*","");

Pour un sous-répertoire, j'ai essayé $files = glob_rec("*.*","/Clic 1 Initiation");

sans succès.

Merci de m'indiquer comment faire, si possible avec un exemple ou deux.

Francois

Posté

Hello,

je ne vois pas pourquoi la fonction "glob" ne fonctionnerait pas ; toutefois le mieux à mon avis pour la remplacer serait une boucle opendir + utilisation de fnmatch.

Posté

Oui, j'ai vu simplement dans un Forum que Golb ne fonctionne pas sur de vieux serveurs Sun; je n'en sais pas plus.

Ce dont je suis sûr, c'est que Glob ne fonctionne pas sur ce site.

J'ai un Glob sur un autre site chez un autre hébergeur qui fonctionne parfaitement.

Aurais tu un exemple de mise en oeuvre de ce que tu suggères?

Par avance merci de ton aide.

Francois

Posté (modifié)

Pour un "exemple de mise en oeuvre", et bien il y a la doc officielle :

- comment parcourir un dossier avec opendir : http://fr.php.net/opendir

- comment appliquer un masque de type "*.truc" à un nom de fichier : http://fr.php.net/fnmatch

Mais j'ai toujours un sérieux doute qu'elle ne fonctionne pas chez ton hébergeur. D'ailleurs quand tu dis qu'elle ne fonctionne pas, c'est qu'elle ne retourne pas le résultat attendu ou bien qu'elle affiche un message d'erreur (et lequel ?). A mon avis il s'agit simplement d'une mauvaise utilisation de la dite fonction...

Modifié par Kioob
Posté

bonjour et merci de vos réponses, je vais tester ça demain dès que possible et je vous tiendrai au courant.

Pour Glob qui ne fonctionne pas, c'est simplement que l'array, qui devrait avoir qqes lignes, est vide.

Merci encore.

Francois

Posté
Pour Glob qui ne fonctionne pas, c'est simplement que l'array, qui devrait avoir qqes lignes, est vide.

Ce qui aurait fortement tendance à confirmer la mauvaise utilisation ; non ?

Posté
Une question de base: ce que tu mets dans

$_foo ='/server/public_html/path/';

est un chemin relatif ou absolu?

Avec un '/' devant, c'est forcément absolu. Mais cela doit fonctionner en relatif (avec tous les problèmes que cela peut poser). Cela fonctionne exactement comme la fonction 'glob'.

Posté

Merci de ta réponse Petit-ourson, qui m'a en particulier permis d'apprendre qqchose sur la déclaration des chemins absolu / relatif.

Avec ton code, le Print_r a bien montré les fichiers existants dans le sous-répertoire choisi:

$_foo ='Clic 1 Initiation';

function s_glob($dir){
$files = array();
if(is_dir($dir)){
if($dh=opendir($dir)){
while(($file = readdir($dh)) !== false){
$files[]=$dir.$file;
}}
}
return $files;
}
print_r(s_glob($_foo));

Simplement, quand je remplace le Print_r par:

if (!$files) 
{ echo 'Aucun fichier présent dans le répertoire.'; }

else { foreach ($files as $filename)
{echo "$filename occupe " . filesize($filename) . " octets\n";}}

j'ai le message Aucun fichier présent...

Mon tout petit niveau de compétence en Php ne m'a pas encore permis de trouver mon erreur.

Merci encore de ton aide.

Francois

Posté

Tu cherches à savoir si $files est FALSE or il ne sera jamais faut vu qu'il est initialisé : $files = array(); (même si je crois que ton problème est surtout un problème de portées de variable).

Il faudrait plutôt faire un count($files) < 1

$files = s_glob($_foo);

if (count($files) < 1)
{ echo 'Aucun fichier présent dans le répertoire.'; }

else { foreach ($files as $filename)
{echo "$filename occupe " . filesize($filename) . " octets\n";}}

Posté (modifié)

bonsoir Petit-ourson et merci de tes efforts.

Je commence, grace à toi, à arriver à un résultat positif, je "vois" les fichiers présents dans un sous-répertoire; j'ai encore du travail à faire pour que ce soit impeccable mais je suis maintenant sur la bonne piste.

Une dernière petite question: pour cibler le même répertoire que celui où se trouve la page avec cette fonction s_glob, je met quoi dans $foo? J'ai essayé *, un espace, un vide, ... sans résultat.

Pour compléter mon histoire avec son commencement, j'avais essayé de faire fonctionner qqechose comme ça:

<?php
$files = glob("*.*");
foreach ($files as $filename) {
echo "$filename occupe " . filesize($filename) . " octets\n";
}
?>

et j'avais obtenu ce message: Invalid argument supplied for foreach() ; j'avais compris / cru comprendre que le Glob ne donnait rien.

J'avais donc recherché un remplacement à Glob(), en particulier après avoir lu dans un forum que Glob() ne fonctionnait pas sur certains vieux serveurs Sun.

Merci encore de ton aide.

Francois

Modifié par francoisch
Posté

bonjour Petit-ourson

Un autre petite question: comment lister uniquement les fichiers *.ppt dans ta fonction?

Je préfère te demander plutôt que de messacrer ton code.

Par avance merci de ton aide.

Francois

Posté

Ce n'est pas mon code, c'est le code de l'aide en ligne de PHP.

function s_glob($dir, $typeFile=null){
$files = array();
if(is_dir($dir)){
if($dh=opendir($dir)){

while(($file = readdir($dh)) !== false){

if($typeFile == null || ereg('\.'.$typeFile.'$', $file)) {
$files[]=$dir.$file;
}
}

}
}
return $files;
}

$files = s_glob($_foo, 'ppt');

Je filtre uniquement par l'extension (avec toutes les erreurs que cela peut engendrer).

Posté (modifié)

bonjour et merci de ta précision qui permet de choisir les fichiers par leur extension.

Une petite question: comment spécifier $foo pour désigner le répertoire courant?

J'ai essayé *, ., un espace, un vide, ... sans résultat.

Par avance encore merci de ton aide précieuse.

Francois

Modifié par francoisch
Posté

bonjour Petit-ourson.

Ca y est, ça marche; j'avais cherché un peu partout mais je n'avais rien trouvé.

Je serais tenté de dire que tu es le meilleur mais ça pourrait te faire gonfler exagérement les chevilles.

Hors toute plaisanterie, merci encore de ton aide patiente et efficace.

Francois

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...