web-dev-qa-db-fra.com

Compter le nombre de fichiers dans le répertoire php

Je travaille sur un projet légèrement nouveau. Je voulais savoir comment le faire pour qu'il compte le nombre de fichiers dans un répertoire donné.

<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, il n'apparaît pas correctement? J'ai ajouté quelques notes alors n'hésitez pas à les supprimer, elles le sont uniquement pour que je puisse la comprendre du mieux que je peux.

Si vous souhaitez des informations supplémentaires ou si vous avez l’impression que je n’ai pas suffisamment décrit cette situation, n'hésitez pas à le dire.

82
Bradly Spicer

Vous pouvez simplement faire ce qui suit:

$fi = new FilesystemIterator(__DIR__, FilesystemIterator::SKIP_DOTS);
printf("There were %d Files", iterator_count($fi));
233
Baba

Vous pouvez obtenir le nombre de fichiers comme suit:

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

"*" est que vous pouvez changer cela en un type de fichier spécifique si vous voulez utiliser "*.jpg" ou vous pouvez créer plusieurs types de fichiers comme ceci:

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

l'indicateur GLOB_BRACE se développe {a, b, c} pour correspondre à 'a', 'b' ou 'c'

58
JKirchartz

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>
42
Laurent Brieu

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

36
intelis

Démo de travail

<?php

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

?>
12
Nirav Ranpara

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

J'ai trouvé que - si tout ce que vous voulez, c'est un nombre 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: (évidemment, glob() ne compte pas les fichiers de points)

1: 99 (0.4815571308136 s)
2: 98 (0.96104407310486 s)
3: 99 (0.26513481140137 s)
12
vbwx

J'utilise ceci:

count(glob("yourdir/*",GLOB_BRACE))
4
<?php echo(count(array_slice(scandir($directory),2))); ?>

array_slice fonctionne de manière similaire à la fonction substr, sauf que cela fonctionne avec des tableaux. 

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

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

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

1
Spooky

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

La meilleure réponse à mon avis:

$num = count(glob("/exact/path/to/files/" . "*"));
echo $num;
  • Cela ne compte pas. et ..
  • C'est un one-liner
  • J'en suis fier
1
w1ll
$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 Entrez le répertoire dans dirname et laissez la magie opérer.

0
oussama

En fonction de la réponse acceptée, voici un moyen de compter tous les fichiers d’un répertoire de manière RÉCURSIVE:

iterator_count(
    new \RecursiveIteratorIterator(
        new \RecursiveDirectoryIterator('/your/directory/here/', \FilesystemIterator::SKIP_DOTS)
    )
)
0
Panni
$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
user3121984