php glob - scan dans les sous-dossiers d'un fichier
J'ai un serveur avec beaucoup de fichiers dans différents dossiers, sous-dossiers et sous-sous-dossiers.
Je suis en train de faire un search.php la page qui sera utilisé pour la recherche de tout le serveur pour un fichier spécifique. Si le fichier est trouvé, puis retourner le chemin de localisation pour afficher un lien de téléchargement.
Voici ce que j'ai à ce jour:
$root = $_SERVER['DOCUMENT_ROOT'];
$search = "test.zip";
$found_files = glob("$root/*/test.zip");
$downloadlink = str_replace("$root/", "", $found_files[0]);
if (!empty($downloadlink)) {
echo "<a href=\"http://www.example.com/$downloadlink\">$search</a>";
}
Le script fonctionne parfaitement si le fichier est à l'intérieur de la racine de mon nom de domaine... Maintenant, je vais essayer de trouver un moyen de le faire aussi scanner les sous-dossiers et sous-sous-sous-dossiers, mais je suis coincé ici.
- stackoverflow.com/questions/8870731/...
- - Vous l'esprit d'avoir plus de chance en utilisant le
file_exists()
fonction. php.net/manual/en/function.file-exists.php (ou un mélange). - ne me dit comment faire pour numériser tous les sous-dossiers et sous-sobfolders pour le fichier...
- Vrai. Avez-vous eu un coup d'oeil sur le lien
messi fan
mettre en place? Semble prometteur. Je suis tenté sa chance avec elle maintenant, et il m'a montré tous les fichiers dans le dossier de départ et sous-dossiers, mais ne fonctionne pas comme vous le souhaitez. De Plus, j'ai les deux yeux dans le même socket droit; qui ont besoin de peu de sommeil, très bientôt.
Vous devez vous connecter pour publier un commentaire.
Il y a 2 façons.
Utilisation
glob
à faire de la recherche récursive:Utilisation
RecursiveDirectoryIterator
RecursiveDirectoryIterator
est livré avec PHP5 toutglob
est de PHP4. Les deux peuvent faire le travail, il est à vous.var_dump(rsearch('/folder/.../', '/.*zip/'));
rglob:var_dump(rglob('/folder/*/test.zip'));
, elle retourne un tableau de correspondance des fichiers.rsearch
, $motif paramètre est l'expression régulière, c'est pourquoi dans mon exemple, il y a 2 barres obliques autour. Vous pouvez utiliser rglob, qui acceptent un paramètre joker.rsearch('/folder/', '/.*mp3/')
correspond également à un fichier nomméfolder/mp3/album/file.mp3
, mais renvoie 'dossier/mp3' comme nom de fichier...RecursiveIteratorIterator
?rglob
- pas la meilleure façon de fonctionner.... ne peut pas trouver les fichiers avec l'extension donnée comme il l'applique à des répertoires ainsi ... il y a une meilleure fonction de surphp.net
-glob()
commentaires. Appeléglob_recursive
afair.rglob
: 0.02864,rsearch
: 0.12413. Ce qui est beaucoup plus plausible, en fait, que dans l'autre sens, je dirais.Cela renvoie nom de chemin complet vers le fichier
appel de la fonction:
Et c'est retourne comme:
Vous pouvez améliorer cette fonction pour rechercher plusieurs fichiers comme tous les fichier jpeg:
Cela peut l'appeler comme:
Ref: https://stackoverflow.com/a/1860417/219112
$file->getExtension ()
plutôt quearray_pop(explode('.', $file))
pour éviter les "PHP attention: Seules les variables doivent être passés par référence dans ...".yield
au lieu de construire un une$return
tableau. Ceci va produire une générateur et améliorer les performances d'un lot.Je veux offrir une autre alternative simple pour les cas où vous pouvez prévoir une profondeur max. Vous pouvez utiliser un modèle avec des accolades liste de tous les possibles sous-dossier profondeurs.
Cet exemple permet 0-3 arbitraire sous-dossiers:
Bien sûr, l'embrassa modèle pourrait être généré de manière progressive.
Comme une solution complète pour votre problème (c'était aussi mon problème):
Vous permet d'obtenir le chemin d'accès complet des éléments que vous souhaitez trouver.