Ich arbeite an einem etwas neuen Projekt. Ich wollte wissen, wie man es erstellt, damit zählt, wie viele Dateien sich in einem bestimmten Verzeichnis befinden.
<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>
Das ist, was ich bis jetzt (vom Suchen) habe. Es erscheint jedoch nicht richtig? Ich habe ein paar Anmerkungen hinzugefügt, also zögern Sie nicht, sie zu entfernen, sie sind nur so, dass ich sie so gut wie möglich verstehen kann.
Wenn Sie weitere Informationen benötigen oder das Gefühl haben, dass ich dies nicht genug beschrieben habe, können Sie dies gerne mitteilen.
Sie können einfach Folgendes tun:
$fi = new FilesystemIterator(__DIR__, FilesystemIterator::SKIP_DOTS);
printf("There were %d Files", iterator_count($fi));
Sie können den Filecount wie folgt erhalten:
$directory = "/path/to/dir/";
$filecount = 0;
$files = glob($directory . "*");
if ($files){
$filecount = count($files);
}
echo "There were $filecount files";
wo "*"
ist, können Sie dies in einen bestimmten Dateityp ändern, wenn Sie "*.jpg"
möchten oder mehrere Dateitypen wie folgt verwenden können:
glob($directory . "*.{jpg,png,gif}",GLOB_BRACE)
das GLOB_BRACE
-Flag erweitert {a, b, c} um 'a', 'b' oder 'c'
Du solltest haben :
<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>
Versuche dies.
// Directory
$directory = "/dir";
// Returns array of files
$files = scandir($directory);
// Count number of files and store them to variable..
$num_files = count($files)-2;
Zählt nicht das '.' und '..'.
Arbeitsdemo
<?php
$directory = "../images/team/harry/"; // dir location
if (glob($directory . "*.*") != false)
{
$filecount = count(glob($directory . "*.*"));
echo $filecount;
}
else
{
echo 0;
}
?>
Da ich das auch brauchte, war ich gespannt, welche Alternative die schnellste war.
Ich fand, dass - wenn Sie nur eine Dateizählung wünschen - Babas Lösung viel schneller ist als die anderen. Ich war ziemlich überrascht.
Probieren Sie es aus:
<?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);
}
?>
Testlauf: (glob()
zählt natürlich keine Punktedateien)
1: 99 (0.4815571308136 s)
2: 98 (0.96104407310486 s)
3: 99 (0.26513481140137 s)
Ich benutze das:
count(glob("yourdir/*",GLOB_BRACE))
<?php echo(count(array_slice(scandir($directory),2))); ?>
array_slice
funktioniert ähnlich wie substr
, nur mit Arrays.
Dies würde beispielsweise die ersten beiden Array-Schlüssel aus dem Array herausschneiden:
$key_zero_one = array_slice($someArray, 0, 2);
Wenn Sie den ersten Parameter nicht angeben, wie im ersten Beispiel, enthält array keine ersten beiden Schlüssel/Wert-Paare * ('.' Und '..').
Vielleicht nützlich für jemanden. Auf einem Windows-System können Sie Windows den Auftrag ausführen lassen, indem Sie den Befehl dir aufrufen. Ich benutze einen absoluten Pfad wie E:/mydir/mysubdir
.
<?php
$mydir='E:/mydir/mysubdir';
$dir=str_replace('/','\\',$mydir);
$total = exec('dir '.$dir.' /b/a-d | find /v /c "::"');
Die beste Antwort meiner Meinung nach:
$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";
}
Dies sollte funktionieren Geben Sie das Verzeichnis im Verzeichnis ein. und lass die magie passieren.
Basierend auf der akzeptierten Antwort können Sie alle Dateien in einem Verzeichnis RECURSIVELY zählen:
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;