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.
Vous pouvez simplement faire ce qui suit:
$fi = new FilesystemIterator(__DIR__, FilesystemIterator::SKIP_DOTS);
printf("There were %d Files", iterator_count($fi));
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";
où "*"
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'
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>
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 '..'.
Démo de travail
<?php
$directory = "../images/team/harry/"; // dir location
if (glob($directory . "*.*") != false)
{
$filecount = count(glob($directory . "*.*"));
echo $filecount;
}
else
{
echo 0;
}
?>
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)
J'utilise ceci:
count(glob("yourdir/*",GLOB_BRACE))
<?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 '..').
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 "::"');
La meilleure réponse à mon avis:
$num = count(glob("/exact/path/to/files/" . "*"));
echo $num;
$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.
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)
)
)
$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;