Compter le nombre de fichiers dans le répertoire PHP

108

Je travaille sur un projet légèrement nouveau. Je voulais savoir combien de fichiers se trouvent dans un certain répertoire.

<div id="header">
<?php 
    $dir = opendir('uploads/'); # This is the directory it will count from
    $i = 0; # Integer starts at 0 before counting

    # While false is not equal to the filedirectory
    while (false !== ($file = readdir($dir))) { 
        if (!in_array($file, array('.', '..') and !is_dir($file)) $i++;
    }

    echo "There were $i files"; # Prints out how many were in the directory
?>
</div>

C'est ce que j'ai jusqu'à présent (de la recherche). Cependant, cela n'apparaît pas correctement? J'ai ajouté quelques notes alors n'hésitez pas à les supprimer, elles le sont juste pour que je puisse les comprendre du mieux que je peux.

Si vous avez besoin de plus d'informations ou si vous pensez que je ne l'ai pas suffisamment décrit, n'hésitez pas à le dire.

Bradly Spicer
la source
4
Il serait plus court d'utiliser un idiome comme count(scandir("uploads/")) - 2celui de cette boucle.
mario
@mario Attention! scandir est bien, mais -2 n'est pas exactement le meilleur - vous pouvez être dans un répertoire racine ou le répertoire peut avoir des répertoires à l'intérieur - Laurent Brieu a une belle vérification pour ./ .. et les répertoires :)
jave.web

Réponses:

263

Vous pouvez simplement faire ce qui suit:

$fi = new FilesystemIterator(__DIR__, FilesystemIterator::SKIP_DOTS);
printf("There were %d Files", iterator_count($fi));
Baba
la source
22
+1 parce que c'est mignon, mais je peux imaginer que c'est assez déroutant / illisible pour la plupart des développeurs PHP. J'irais avec l'une des approches des autres réponses.
user428517
Bien qu'utile, ce n'était pas très facile à lire quand j'ai posé la question. Cela dit, j'ai amélioré mes connaissances en php. Je n'ai pas voté pour cela.
Bradly Spicer
2
Cela devrait être la réponse acceptée, à moins que le demandeur ne veuille une version plus personnalisée, où il pourrait exclure certains fichiers.
Abhishek Madhani
1
Étant donné que les gens disent que cela est déroutant pour certains développeurs, faut-il ajouter que si l'on utilise des espaces de noms (puisque cette méthode nécessite une version récente de PHP dans tous les cas), alors il faut également spécifier l'espace de noms: $ fi = new \ FilesystemIterator ( DIR , \ FilesystemIterator :: SKIP_DOTS);
graemeboy
2
Vous n'avez pas besoin de passer le drapeau FilesystemIterator::SKIP_DOTSpar défaut de toute façon.
Eborbob
70

Vous pouvez obtenir le nombre de fichiers comme ceci:

$directory = "/path/to/dir/";
$filecount = 0;
$files = glob($directory . "*");
if ($files){
 $filecount = count($files);
}
echo "There were $filecount files";

"*"est, vous pouvez changer cela en un type de fichier spécifique si vous le souhaitez "*.jpg"ou vous pouvez faire plusieurs types de fichiers comme celui-ci:

glob($directory . "*.{jpg,png,gif}",GLOB_BRACE)

l' GLOB_BRACEindicateur développe {a, b, c} pour correspondre à 'a', 'b' ou 'c'

JKirchartz
la source
3
Génial, il y a beaucoup de possibilités avec cette approche pour filtrer les fichiers et les compter :) Créer une boucle simple et plusieurs conditions serait génial ... Mais comment pouvez-vous inclure d'autres répertoires dans ces répertoires et ainsi de suite pour tout compter fichiers et exclure les répertoires du décompte?
The Bumpaster
1
@TheBumpaster consultez cette question / réponses SO sur la façon de scanner les sous-répertoires avec glob: stackoverflow.com/q/12109042/276250
JKirchartz
2
Pour qui cette solution ne fonctionne pas, ajoutez __DIR__ . avant "/path/to/dir/"( __DIR__ . "/path/to/dir/")
dnns
@dnns En fait, ajouter quoi que ce soit à /path/to/dircela échouerait, car le premier /signifie starting from root dir. S'il y en avait path/to/dir, alors oui, __DIR__ . '/path/to/dir'cela aiderait (dans ce cas, vous devez utiliser /après__DIR__
Justinas
43

Essaye ça.

// Directory
$directory = "/dir";

// Returns array of files
$files = scandir($directory);

// Count number of files and store them to variable..
$num_files = count($files)-2;

Sans compter le "." et '..'.

Intelis
la source
5
Peut $num_files = count($files) - 2;- être ? À cause de .ainsi que..
Havelock
Notez qu'il comptera également ces deux: '.' et '..'
Laurent Brieu
7
pour se débarrasser de .et ..essayez ceci: $ files =array_diff( scandir("/dir"), array(".", "..") );
JKirchartz
2
array_slice(scandir($directory),2)
Spooky
42

Tu aurais dû :

<div id="header">
<?php 
    // integer starts at 0 before counting
    $i = 0; 
    $dir = 'uploads/';
    if ($handle = opendir($dir)) {
        while (($file = readdir($handle)) !== false){
            if (!in_array($file, array('.', '..')) && !is_dir($dir.$file)) 
                $i++;
        }
    }
    // prints out how many were in the directory
    echo "There were $i files";
?>
</div>
Laurent Brieu
la source
c'est le même code et ne fonctionne pas: $ file = readdir ($ dh) devrait être $ file = readdir ($ dir)
Marco Pace
2
Ce serait bien (et avant tout utile) de souligner les différences / erreurs que l'OP a faites dans un texte minimaliste.
Havelock
1
Hé là, merci pour ça. Cela n'apparaîtra toujours pas pour moi, mais je pense que cela pourrait être lié à ma feuille de style ou à quelque chose du genre. De toute façon merci beaucoup pour votre aide. Edit: Corrigé :) Merci beaucoup!
Bradly Spicer
N'oubliez pas de fermer le répertoire :)
jave.web
16

La meilleure réponse à mon avis:

$num = count(glob("/exact/path/to/files/" . "*"));
echo $num;
  • Ça ne compte pas. et ..
  • C'est une doublure
  • J'en suis fier

la source
Je viens de réaliser que vous pouvez utiliser "dossier / *" si votre document PHP est dans le même répertoire!
Un paquebot devrait avoir des récompenses de réputation x2 ... en fait, le rendre x3
baron_bartek
1
Que voulez-vous dire? "Ça ne compte pas".
habibhassani
13

Comme j'avais besoin de cela aussi, j'étais curieux de savoir quelle alternative était la plus rapide.

J'ai trouvé que - si tout ce que vous voulez est un décompte de fichiers - la solution de Baba est beaucoup plus rapide que les autres. J'ai été assez surpris.

Essayez vous-même:

<?php
define('MYDIR', '...');

foreach (array(1, 2, 3) as $i)
{
    $t = microtime(true);
    $count = run($i);
    echo "$i: $count (".(microtime(true) - $t)." s)\n";
}

function run ($n)
{
    $func = "countFiles$n";
    $x = 0;
    for ($f = 0; $f < 5000; $f++)
        $x = $func();
    return $x;
}

function countFiles1 ()
{
    $dir = opendir(MYDIR);
    $c = 0;
    while (($file = readdir($dir)) !== false)
        if (!in_array($file, array('.', '..')))
            $c++;
    closedir($dir);
    return $c;
}

function countFiles2 ()
{
    chdir(MYDIR);
    return count(glob("*"));
}

function countFiles3 () // Fastest method
{
    $f = new FilesystemIterator(MYDIR, FilesystemIterator::SKIP_DOTS);
    return iterator_count($f);
}
?>

Test de fonctionnement: (évidemment, glob()ne compte pas les fichiers à points)

1: 99 (0.4815571308136 s)
2: 98 (0.96104407310486 s)
3: 99 (0.26513481140137 s)
vbwx
la source
Enfin, lequel est le plus rapide car vous n'avez pas mentionné le résultat?
Alex
J'ai dit que la solution de Baba était la plus rapide, mais bien sûr, j'aurais dû être plus clair sur les résultats. Corrigé maintenant.
vbwx
12

Démo de travail

<?php

$directory = "../images/team/harry/"; // dir location
if (glob($directory . "*.*") != false)
{
 $filecount = count(glob($directory . "*.*"));
 echo $filecount;
}
else
{
 echo 0;
}

?>
Nirav Ranpara
la source
J'éviterais d'appeler glob () 2 fois si vous avez beaucoup de fichiers dans le répertoire. Au lieu de cela, j'attribuerais le résultat du premier glob en variable et utiliserais le décompte sur cette variable.
Konrad Gałęzowski
5

J'utilise ceci:

count(glob("yourdir/*",GLOB_BRACE))
Philipp Werminghausen
la source
C'est le premier qui fonctionne pour moi, mais a le problème qu'il ne vous donne pas l'assurance que tous les fichiers comptés sont des images.
Sterling Diaz
1
<?php echo(count(array_slice(scandir($directory),2))); ?>

array_slicefonctionne de la même manière que la substrfonction, mais fonctionne avec des tableaux.

Par exemple, cela couperait les deux premières clés du tableau du tableau:

$key_zero_one = array_slice($someArray, 0, 2);

Et si vous omettez le premier paramètre, comme dans le premier exemple, le tableau ne contiendra pas les deux premières paires clé / valeur * ('.' Et '..').

Effrayant
la source
1
C'est fondamentalement la même réponse que celle qui a déjà été proposée par d'autres affiches. Pouvez-vous améliorer votre réponse ou ajouter d'autres informations que celles qui ont déjà été discutées?
Joe Miller
Meilleur .. ? Laissez-les lire un peu plus le manuel de php.net que d'habitude. :)
Spooky
1

Peut-être utile à quelqu'un. Sur un système Windows, vous pouvez laisser Windows faire le travail en appelant la commande dir. J'utilise un chemin absolu, comme E:/mydir/mysubdir.

<?php 
$mydir='E:/mydir/mysubdir';
$dir=str_replace('/','\\',$mydir);
$total = exec('dir '.$dir.' /b/a-d | find /v /c "::"');
Michel
la source
0
$it = new filesystemiterator(dirname("Enter directory here"));
printf("There were %d Files", iterator_count($it));
echo("<br/>");
    foreach ($it as $fileinfo) {
        echo $fileinfo->getFilename() . "<br/>\n";
    } 

Cela devrait fonctionner dans le répertoire dans dirname. et laissez la magie opérer.

oussama
la source
0
$files = glob('uploads/*');
$count = 0;
$totalCount = 0;
$subFileCount = 0;
foreach ($files as $file) 
{  
    global $count, $totalCount;
    if(is_dir($file))
    {
        $totalCount += getFileCount($file);
    }
    if(is_file($file))
    {
        $count++;  
    }  
}

function getFileCount($dir)
{
    global $subFileCount;
    if(is_dir($dir))
    {
        $subfiles = glob($dir.'/*');
        if(count($subfiles))
        {      
            foreach ($subfiles as $file) 
            {
                getFileCount($file);
            }
        }
    }
    if(is_file($dir))
    {
        $subFileCount++;
    }
    return $subFileCount;
}

$totalFilesCount = $count + $totalCount; 
echo 'Total Files Count ' . $totalFilesCount;
user3121984
la source
0

Sur la base de la réponse acceptée, voici un moyen de compter tous les fichiers dans un répertoire de manière récurrente:

iterator_count(
    new \RecursiveIteratorIterator(
        new \RecursiveDirectoryIterator('/your/directory/here/', \FilesystemIterator::SKIP_DOTS)
    )
)
Panni
la source
0

Voici une fonction PHP Linux qui est considérablement rapide. Un peu sale, mais ça fait le boulot!

$ dir - chemin vers le répertoire

$ type - f, d ou false (par défaut)

f - renvoie uniquement le nombre de fichiers

d - renvoie uniquement le nombre de dossiers

false - renvoie le nombre total de fichiers et de dossiers

function folderfiles($dir, $type=false) {
    $f = escapeshellarg($dir);
    if($type == 'f') {
        $io = popen ( '/usr/bin/find ' . $f . ' -type f | wc -l', 'r' );
    } elseif($type == 'd') {
        $io = popen ( '/usr/bin/find ' . $f . ' -type d | wc -l', 'r' );
    } else {
        $io = popen ( '/usr/bin/find ' . $f . ' | wc -l', 'r' );
    }

    $size = fgets ( $io, 4096);
    pclose ( $io );
    return $size;
}

Vous pouvez ajuster pour répondre à vos besoins.

Veuillez noter que cela ne fonctionnera pas sous Windows.

GTodorov
la source
-2
  simple code add for file .php then your folder which number of file to count its      

    $directory = "images/icons";
    $files = scandir($directory);
    for($i = 0 ; $i < count($files) ; $i++){
        if($files[$i] !='.' && $files[$i] !='..')
        { echo $files[$i]; echo "<br>";
            $file_new[] = $files[$i];
        }
    }
    echo $num_files = count($file_new);

simple ajouter c'est fait ....

parajs dfsb
la source
ajoutez quelques explications à votre code pour le rendre plus clair.
Alex.K.