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.


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));

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'


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 '..'.


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>

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

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)

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;
}

?>

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))

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 '..').


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 "::"');

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.


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;

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)
    )
)

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.


-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 ....


ajoutez quelques explications à votre code pour le rendre plus clair.
Alex.K.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.