Je ne sais pas ce qu'il en est pour les autres systèmes de fichiers (NTFS, Linux,
etc.), mais pour les systèmes FAT (12, 16 et 32), la description d'un (sous-)dossier N'indique PAS le nombre de fichiers à l'intérieur, il n'y a que le sommaire du contenu (la liste des 'entrées', blocs de 32 = 0x20 octets) qu'il faut donc scanner pour compter un à un les fichiers : il suffit de lire l'octet d'attribut, d'offset 0x0B par rapport au début du bloc, et de vérifier que les bits 3 et 4 soient à 0 (sinon, ce n'est pas un fichier unique), c'est-à-dire qu'en faisant un ET logique entre l'octet d'attribut et 0b0001_1000 = 0x18, on a bien 0.
Si tu veux également compter les sous-dossiers (bit 4 mis à 1), il n'y a qu'à vérifier que le bit 3 soit à 0 (ET logique avec 0x80), et enlever 2 au nombre obtenu (puisque les dossiers
. et
.. sont comptabilisés).
Voir cette
excellente analyse de la FAT12 ...
Si le serveur PHP est installé sur un système FAT, il est donc de toute façon obligé de 'compter à la main' les fichiers ...
S'il est installé sur un autre système de fichiers, peut-être peut-il obtenir directement cette valeur.
Mais le PHP étant multi-plateformes, les différentes méthodes de comptage selon le système de fichier seront génériquement accessibles par une seule fonction commune.
Je ne sais pas si cette fonction existe (je ne l'ai pas trouvée), les seules fonctions approchantes étant
scandir (citée par Nil) qui donne la fameuse liste des entrées, suivie éventuellement (pour n'avoir que les fichiers) de
is_file appliquée à chaque élément de l'array obtenu (si on veut aussi les sous-dossiers, ne pas oublier de retrancher 2 à la taille de l'array obtenu par
scandir).
La fonction
glob (citée par nTOME) est en effet plus rapide pour un comptage simple, puisqu'il suffit, après avoir fait
glob("*"), de compter avec
count le nombre d'élément de l'array (peut-être faut-il retrancher 2), et éventuellement, pour n'avoir que le nombre de fichiers, enlever à la valeur précédente (sans y avoir soustrait 2) le nombre d'éléments de l'array obtenu par
glob("*", GLOB_ONLYDIR).
@++