it-swarm.com.de

Zählen Sie, wie viele Dateien im Verzeichnis php

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.

82
Bradly Spicer

Sie können einfach Folgendes tun:

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

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'

58
JKirchartz

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

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

36
intelis

Arbeitsdemo

<?php

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

?>
12
Nirav Ranpara

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

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

1
Spooky

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

Die beste Antwort meiner Meinung nach:

$num = count(glob("/exact/path/to/files/" . "*"));
echo $num;
  • Es zählt nicht. und ..
  • Es ist ein Liner
  • Ich bin stolz darauf
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";
    } 

Dies sollte funktionieren Geben Sie das Verzeichnis im Verzeichnis ein. und lass die magie passieren.

0
oussama

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