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>
glob()
, opendir()
, readdir()
, closedir()
, scandir()
et 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 glob()
opendir()
sont une solution en ligne qui permet le filtrage, mais manque de flexibilité. Au lieu de cela, readdir()
, closedir()
et 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
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
$pattern
$flags
*.txt
Voyons quelques exemples! Pour rechercher tous les fichiers et répertoires se terminant par
<?php $filelist = glob("*.txt");
$filelist
Si vous affichez
<code>array ( 0 => 'article.txt', 1 => 'text.txt' )</code>
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*");
La sortie est:
<code>array ( 0 => 'test.dat', 1 => 'text.txt' )</code>
Pour obtenir uniquement la liste des répertoires contenant "MA", le code est le suivant:
<?php $filelist = glob("*ma*", GLOB_ONLYDIR);
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>
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).
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");
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>
Comme vous l'avez peut-être deviné, l'utilisation du code ci-dessus produit la sortie suivante:
<?php $filelist = glob("te*");
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>
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");
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>
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>
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");
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>
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:
glob()
sont une solution en ligne qui permet le filtrage, mais elle n'est pas très flexible. opendir()
, readdir()
et closedir()
sont un peu verbeux et nécessitent un post-filtrage, mais sont plus flexibles. scandir()
nécessitent également un post-filtrage, mais ne nécessitent pas de poignées de gestion. 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
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.
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.
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.
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.
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.
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.
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.
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()
.
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.
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!