Maison > développement back-end > tutoriel php > PHP Master | Liste des fichiers et des répertoires avec PHP

PHP Master | Liste des fichiers et des répertoires avec PHP

Joseph Gordon-Levitt
Libérer: 2025-02-25 18:23:17
original
198 Les gens l'ont consulté

PHP Master | List Files and Directories with PHP

Cet article traite des tâches courantes dans le développement d'applications PHP: listing des fichiers et des répertoires. Nous présenterons plusieurs solutions de base et avancées et analyserons leurs avantages et leurs inconvénients. Tout d'abord, nous introduirons trois façons d'utiliser des fonctions PHP de base, puis passerons progressivement à un moyen plus puissant de tirer parti des itérateurs SPL. Par souci de discussion, nous supposons que la structure du répertoire est la suivante:

<code>---manager
|
---user
|   ---document.txt
|   ---data.dat
|   ---style.css
|---article.txt
|---master.dat
|---script.php
|---test.dat
|---text.txt</code>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

points clés

  • PHP fournit plusieurs fonctions pour répertorier les fichiers et les répertoires, y compris glob(), opendir(), readdir(), closedir(), scandir() et
  • . La flexibilité de ces fonctions varie et certaines nécessitent un post-filtrage.
  • FilesystemIterator La bibliothèque PHP standard (SPL) fournit des solutions orientées objet pour répertorier les fichiers et les répertoires, y compris RecursiveDirectoryIterator, GlobIterator et
  • . Ces itérateurs peuvent être étendus pour mieux répondre aux besoins spécifiques.
  • Les fonctions glob() opendir() sont une solution en ligne qui permet le filtrage, mais manque de flexibilité. Au lieu de cela, readdir(), closedir() et
  • offrent une plus grande flexibilité, mais nécessitent plus de code verbeux et post-filtrage.
  • scandir() GlobIterator Les fonctions nécessitent également un post-filtrage, mais ne nécessitent pas de gestion des poignées de fichiers. Pour les méthodes orientées objet, la bibliothèque SPL doit être utilisée. RegexIterator permet le pré-filtrage, tandis que d'autres itérateurs peuvent utiliser
  • pour obtenir les mêmes fonctionnalités.

Solution de base

glob() Le premier ensemble de méthodes démontre l'utilisation des fonctions opendir(), la combinaison des fonctions readdir(), closedir() et scandir(), et l'utilisation des fonctions

.

glob() Utilisation

glob() La première fonction à discuter est

, qui nous permet de rechercher des noms de chemin à l'aide de jokers similaires à la coque la plus célèbre. Cette fonction a deux paramètres:
  • $pattern
  • (requis): mode de recherche
  • $flags
  • (Facultatif): Un ou plusieurs drapeaux répertoriés dans la documentation officielle

*.txt Voyons quelques exemples! Pour rechercher tous les fichiers et répertoires se terminant par

dans un répertoire, vous pouvez écrire:
<?php $filelist = glob("*.txt");
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

$filelist Si vous affichez

, la sortie sera:
<code>array (
  0 => 'article.txt',
  1 => 'text.txt'
)</code>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Si vous voulez une liste de fichiers et répertoires en commençant par "TE", le code que vous souhaitez écrire est:
<?php $filelist = glob("te*");
Copier après la connexion
Copier après la connexion

La sortie est:
<code>array (
  0 => 'test.dat',
  1 => 'text.txt'
)</code>
Copier après la connexion

Pour obtenir uniquement la liste des répertoires contenant "MA", le code est le suivant:
<?php $filelist = glob("*ma*", GLOB_ONLYDIR);
Copier après la connexion

Dans ce dernier exemple, la sortie est: <🎜>
<code>---manager
|
---user
|   ---document.txt
|   ---data.dat
|   ---style.css
|---article.txt
|---master.dat
|---script.php
|---test.dat
|---text.txt</code>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Notez que le dernier exemple utilise la constante GLOB_ONLYDIR comme deuxième paramètre facultatif. Comme vous pouvez le voir, un fichier nommé master.dat est exclu. Bien que la fonction glob() soit facile à utiliser, elle n'est pas flexible dans certains cas. Par exemple, il n'a pas de drapeaux pour récupérer uniquement les fichiers correspondant au modèle donné (pas les répertoires).

utiliser opendir() et readdir()

La deuxième méthode de lecture des fichiers et des répertoires que je souhaite discuter implique les fonctions opendir(), readdir() et closedir(). opendir() Ouvrez le répertoire et revenez à la poignée de connexion. Une fois la poignée récupérée, vous pouvez utiliser readdir(). Chaque fois que cette fonction est appelée, elle donne le nom du fichier ou du répertoire suivant dans le répertoire ouvert. Une fois tous les noms récupérés, la fonction renvoie false. Pour fermer la poignée, vous pouvez utiliser closedir(). Contrairement à glob(), cette approche est un peu plus compliquée car vous n'avez pas de paramètres pour vous aider à filtrer les fichiers et répertoires renvoyés. Vous devez vous faire du filtrage pour obtenir ce que vous voulez. Pour être parallèle à la fonction glob(), l'exemple suivant récupère une liste de tous les fichiers et répertoires commençant par "TE":

<?php $filelist = glob("*.txt");
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

La sortie est la même que dans l'exemple précédent. Cependant, si vous exécutez le code ci-dessus et que vous sortez la valeur de $entry à l'exécution, vous constaterez qu'il contient parfois des entrées étranges: "." Et "..". Ce sont deux répertoires virtuels que vous trouverez dans chaque répertoire du système de fichiers. Ils représentent respectivement le répertoire actuel et le répertoire parent (le dossier précédent). Le deuxième exemple montre comment récupérer uniquement les fichiers contenus dans un chemin donné.

<code>array (
  0 => 'article.txt',
  1 => 'text.txt'
)</code>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Comme vous l'avez peut-être deviné, l'utilisation du code ci-dessus produit la sortie suivante:

<?php $filelist = glob("te*");
Copier après la connexion
Copier après la connexion

Utilisation scandir()

Enfin, je veux introduire la fonction scandir(). Il n'a qu'un seul paramètre requis: le chemin à lire. La valeur de retour est un tableau de fichiers et répertoires contenus dans le chemin. Comme pour la dernière solution, pour récupérer un sous-ensemble de fichiers et de répertoires, vous devez faire vous-même un post-filtre. D'un autre côté, comme vous pouvez le voir dans le code ci-dessous, cette solution est plus simple et ne nécessite pas de gestion des poignées de fichiers. Cet exemple montre comment récupérer les fichiers et les répertoires en commençant par la chaîne "te":

<code>---manager
|
---user
|   ---document.txt
|   ---data.dat
|   ---style.css
|---article.txt
|---master.dat
|---script.php
|---test.dat
|---text.txt</code>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Utilisons le spl iterator

Maintenant, parlons de certains itérateurs SPL. Mais avant de plonger dans leur utilisation, permettez-moi de les présenter et de la bibliothèque SPL. SPL fournit une gamme de structures de données orientées objet, d'itérateurs, de gestionnaires de fichiers et d'autres classes. L'un des avantages est que les itérateurs sont des cours, vous pouvez donc les étendre pour mieux répondre à vos besoins. Un autre avantage est qu'ils ont des méthodes natives très utiles qui peuvent vous aider avec de nombreuses tâches courantes auxquelles vous pouvez faire face, et vous pouvez les trouver en un seul endroit. Par exemple, en utilisant readdir() dans FilesystemIterator, les deux seront utilisés dans une boucle, mais lorsque vous utilisez readdir(), votre entrée est juste une chaîne, et lorsque vous utilisez FilesystemIterator vous en avez une qui peut vous donner le fichier pertinent ou le répertoire contient une grande quantité d'informations (taille, propriétaire, autorisation, etc.). Bien sûr, PHP peut utiliser des fonctions comme filesize() et fileowner() pour vous donner les mêmes informations, mais PHP5 a transformé son approche de la POO. Donc, dans l'ensemble, mon conseil est de suivre les nouvelles meilleures pratiques de la langue ici. Si vous avez besoin de plus d'informations générales sur les itérateurs SPL, consultez l'utilisation des itérateurs SPL. Comme indiqué dans l'introduction, je montrerai l'utilisation de FilesystemIterator, RecursiveDirectoryIterator et GlobIterator. Le premier hérite de DirectoryIterator, tandis que les autres héritent de FilesystemIterator. Ils ont tous le même constructeur, qui n'a que deux paramètres:

  • $path (requis): le chemin du projet du système de fichiers pour itérer
  • $flags (Facultatif): Un ou plusieurs drapeaux répertoriés dans la documentation officielle

La différence réelle entre ces itérateurs est à leur manière de naviguer sur un chemin donné.

FilesystemIterator

L'utilisation FilesystemIterator est très simple. Pour montrer comment c'est pratique, je vais montrer deux exemples. Dans le premier exemple, je rechercherai tous les fichiers et répertoires à partir de la chaîne "TE", tandis que le deuxième exemple utilisera un autre iterator RegexIterator pour rechercher tous les fichiers «T.Dat» ou «T. php ». RegexIterator utilisé pour filtrer un autre itérateur en fonction des expressions régulières.

<?php $filelist = glob("*.txt");
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Utilisez le code ci-dessus, le résultat est le même que dans l'exemple précédent. Le deuxième exemple d'utilisation RegexIterator est:

<code>array (
  0 => 'article.txt',
  1 => 'text.txt'
)</code>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Dans ce cas, la sortie est:

<code>---manager
|
---user
|   ---document.txt
|   ---data.dat
|   ---style.css
|---article.txt
|---master.dat
|---script.php
|---test.dat
|---text.txt</code>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

RecursiveDirectoryIterator

RecursiveDirectoryIterator Fournit une interface pour itérer récursivement le répertoire du système de fichiers. En raison de son objectif, il a des méthodes utiles, telles que getChildren() et hasChildren(), qui renvoie l'itérateur pour l'entrée actuelle (s'il s'agit d'un répertoire) et si l'entrée actuelle est un répertoire. Pour montrer l'application pratique de RecursiveDirectoryIterator et getChildren(), je réécrivrai le dernier exemple pour obtenir le même résultat.

<?php $filelist = glob("*.txt");
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

GlobIterator

GlobIterator itère sur le système de fichiers d'une manière similaire à la fonction glob(). Par conséquent, le premier paramètre peut contenir un panier. Le code suivant montre des exemples courants d'utilisation GlobIterator.

<code>array (
  0 => 'article.txt',
  1 => 'text.txt'
)</code>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Conclusion

Dans cet article, j'illustre différentes façons d'atteindre le même objectif: comment récupérer et filtrer les fichiers et répertoires dans un chemin donné. Voici quelques points clés à retenir:

    Les fonctions
  • glob() sont une solution en ligne qui permet le filtrage, mais elle n'est pas très flexible.
  • Les solutions utilisant opendir(), readdir() et closedir() sont un peu verbeux et nécessitent un post-filtrage, mais sont plus flexibles.
  • Les fonctions
  • scandir() nécessitent également un post-filtrage, mais ne nécessitent pas de poignées de gestion.
  • Si vous souhaitez utiliser la méthode OOP, vous devez utiliser la bibliothèque SPL. De plus, vous pouvez étendre les cours en fonction de vos besoins.
  • Alors que GlobIterator est capable de pré-filtrage, d'autres itérateurs peuvent utiliser RegexIterator pour obtenir les mêmes fonctionnalités de manière confortable.

Connaissez-vous d'autres façons d'y parvenir? Si oui, et que vous souhaitez partager avec nous, veuillez continuer. Le partage créatif est toujours populaire. images de Fotolia

FAQ (FAQ) sur la liste des fichiers et des répertoires à l'aide de php

Comment trier les fichiers et les répertoires dans PHP?

le sort() peut être utilisé pour trier les fichiers et les répertoires dans PHP. Après avoir récupéré des fichiers et des répertoires à l'aide de la fonction scandir(), vous pouvez appliquer la fonction sort() pour les organiser par ordre croissant. Si vous souhaitez les trier par ordre décroissant, vous pouvez utiliser la fonction rsort(). N'oubliez pas de passer le fichier et les tableaux de répertoire sous forme de paramètres à ces fonctions.

Comment exclure certains fichiers ou répertoires lors de la liste des fichiers et des répertoires en PHP?

Pour exclure certains fichiers ou répertoires, vous pouvez utiliser la fonction in_array() en conjonction avec la fonction scandir(). in_array() La fonction vérifie si une valeur existe dans un tableau. Vous pouvez créer un tableau de fichiers ou de répertoires pour exclure et utiliser la fonction in_array() pour vérifier si le fichier ou le répertoire existe dans le tableau. S'il existe, vous pouvez le sauter.

Comment répertorier les répertoires uniquement dans PHP et non sur les fichiers?

Pour répertorier uniquement les répertoires au lieu de fichiers, vous pouvez utiliser la fonction is_dir(). Cette fonction vérifie si un chemin est un répertoire. Vous pouvez l'utiliser conjointement avec la fonction scandir() pour vérifier si chaque élément du tableau renvoyé par scandir() est un répertoire. Si c'est le cas, vous pouvez l'inclure dans votre liste.

Comment répertorier récursivement les fichiers et les répertoires dans PHP?

Pour répertorier récursivement les fichiers et les répertoires, vous pouvez créer une fonction récursive qui utilise la fonction scandir() pour obtenir les fichiers et les répertoires, puis s'appelle pour chaque répertoire qu'il trouve. Cela lui permettra de traverser l'ensemble de l'arbre du répertoire.

Comment puis-je obtenir la taille de chaque fichier en PHP lors de la liste d'un fichier?

Pour obtenir la taille de chaque fichier, vous pouvez utiliser la fonction filesize(). Cette fonction renvoie la taille du fichier en octets. Vous pouvez l'utiliser en conjonction avec la fonction scandir() pour obtenir la taille de chaque fichier lors de la répertorie.

Comment puis-je obtenir la dernière date modifiée de chaque fichier en PHP lors de la liste d'un fichier?

Pour obtenir la dernière date modifiée pour chaque fichier, vous pouvez utiliser la fonction filemtime(). Cette fonction renvoie le dernier temps de modification du fichier en tant qu'horodatage Unix. Vous pouvez l'utiliser en conjonction avec la fonction scandir() pour obtenir la dernière date modifiée de chaque fichier lors de la répertorie.

Comment filtrer les fichiers par extension lors de la liste des fichiers en PHP?

Pour filtrer les fichiers par extension, vous pouvez utiliser la fonction pathinfo(). Cette fonction renvoie des informations sur le chemin du fichier, y compris l'extension. Vous pouvez l'utiliser conjointement avec la fonction scandir() pour filtrer les fichiers par extension lors de la répertorie.

Comment répertorier les fichiers et les répertoires dans les répertoires distants de PHP?

Pour répertorier les fichiers et les répertoires dans les répertoires distants, vous pouvez utiliser la fonction ftp_nlist(). Cette fonction renvoie une liste de fichiers et répertoires dans le répertoire spécifié sur le serveur FTP. Avant d'utiliser ftp_nlist(), vous devez établir une connexion FTP à l'aide des fonctions ftp_connect() et ftp_login().

Comment gérer les erreurs lors de la liste des fichiers et des répertoires en PHP?

Pour gérer les erreurs lors de la liste des fichiers et des répertoires, vous pouvez utiliser les fonctions error_reporting() et set_error_handler(). Ces fonctions vous permettent de définir le niveau de rapport d'erreur et de définir une fonction de gestionnaire d'erreur personnalisée qui sera appelée lorsqu'une erreur se produit.

Comment répertorier les fichiers et les répertoires dans les archives ZIP dans PHP?

Pour répertorier les fichiers et les répertoires dans une archive zip, vous pouvez utiliser la classe ZipArchive. Cette classe fournit des méthodes pour gérer les archives zip, y compris la méthode getFromName(), qui vous permet de récupérer le contenu des fichiers dans l'archive.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal