Zählen Sie, wie viele Dateien sich im Verzeichnis PHP befinden

106

Ich arbeite an einem etwas neuen Projekt. Ich wollte wissen, 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 habe ich bisher (von der Suche). Es erscheint jedoch nicht richtig? Ich habe ein paar Notizen hinzugefügt, also zögern Sie nicht, sie zu entfernen. Sie dienen nur dazu, sie so gut wie möglich zu verstehen.

Wenn Sie weitere Informationen benötigen oder das Gefühl haben, dass ich dies nicht genug beschrieben habe, können Sie dies gerne angeben.

Bradly Spicer
quelle
4
Es wäre kürzer, eine Redewendung wie count(scandir("uploads/")) - 2diese Schleife zu verwenden.
Mario
@ Mario Vorsicht! scandir ist nett, aber -2 ist nicht gerade das Beste - Sie können sich in einem Stammverzeichnis befinden oder das Verzeichnis kann Verzeichnisse enthalten - Laurent Brieu hat eine nette Prüfung für ./ .. und Verzeichnisse :)
jave.web

Antworten:

261

Sie können einfach Folgendes tun:

$fi = new FilesystemIterator(__DIR__, FilesystemIterator::SKIP_DOTS);
printf("There were %d Files", iterator_count($fi));
Baba
quelle
22
+1, weil das süß ist, aber ich kann mir vorstellen, dass es für die meisten PHP-Entwickler ziemlich verwirrend / unlesbar ist. Ich würde mit einem der Ansätze in den anderen Antworten gehen.
user428517
Obwohl nützlich, war es nicht sehr einfach zu lesen, als ich die Frage stellte. Wenn ich das sage, habe ich meine Kenntnisse über PHP verbessert. Ich habe dies nicht positiv bewertet.
Bradly Spicer
2
Dies sollte die akzeptierte Antwort sein, es sei denn, der Fragesteller möchte eine individuellere Version, in der bestimmte Dateien ausgeschlossen werden können.
Abhishek Madhani
1
Angesichts der Tatsache, dass die Leute sagen, dass dies für einige Entwickler verwirrend ist, sollten wir hinzufügen, dass bei Verwendung von Namespaces (da diese Methode in jedem Fall eine neuere Version von PHP erfordert) auch der Namespace angegeben werden muss: $ fi = new \ FilesystemIterator ( DIR , \ FilesystemIterator :: SKIP_DOTS);
Graemeboy
2
Sie müssen das Flag nicht übergeben, FilesystemIterator::SKIP_DOTSda dies ohnehin Standard ist.
Eborbob
70

Sie können die Anzahl der Dateien wie folgt abrufen:

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

Wo das "*"ist, können Sie das in einen bestimmten Dateityp ändern, wenn Sie möchten, "*.jpg"oder Sie können mehrere Dateitypen wie diesen ausführen:

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

Das GLOB_BRACEFlag erweitert {a, b, c} um 'a', 'b' oder 'c'.

JKirchartz
quelle
3
Genial, es gibt viele Möglichkeiten mit diesem Ansatz, Dateien zu filtern und zu zählen :) Das Erstellen einer einfachen Schleife und mehrerer Bedingungen wäre großartig ... Aber wie können Sie andere Verzeichnisse in diese Verzeichnisse aufnehmen und so weiter, um alle zu zählen Dateien und Verzeichnisse von der Zählung ausschließen?
The Bumpaster
1
@ TheBumpaster Schauen Sie sich diese SO Frage / Antworten zum Scannen von Unterverzeichnissen mit glob an: stackoverflow.com/q/12109042/276250
JKirchartz
2
Für wen diese Lösung nicht funktioniert, fügen Sie __DIR__ . vor "/path/to/dir/"( __DIR__ . "/path/to/dir/")
dnns
@dnns Eigentlich würde das Hinzufügen von etwas /path/to/dirfehlschlagen, weil zuerst /bedeutet starting from root dir. Wenn path/to/dirja, dann __DIR__ . '/path/to/dir'würde ja helfen (in diesem Fall müssen Sie /nach__DIR__
Justinas
43

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;

Ohne das '.' und '..'.

Intelis
quelle
5
Vielleicht $num_files = count($files) - 2;? Wegen .sowie..
Havelock
Beachten Sie, dass auch diese beiden gezählt werden: '.' und '..'
Laurent Brieu
7
um das loszuwerden .und dies zu ..versuchen: $ files =array_diff( scandir("/dir"), array(".", "..") );
JKirchartz
1
array_slice(scandir($directory),2)
Spooky
42

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>
Laurent Brieu
quelle
Es ist der gleiche Code und funktioniert nicht: $ file = readdir ($ dh) sollte $ file = readdir ($ dir) sein
Marco Pace
2
Es wäre schön (und vor allem hilfreich), in einem minimalistischen Text auf die Unterschiede / Fehler hinzuweisen, die das OP gemacht hat.
Havelock
1
Hey, danke dafür. Es wird mir immer noch nicht angezeigt, aber ich habe das Gefühl, dass dies mit meinem Stylesheet oder etwas in dieser Richtung zu tun haben könnte. Auf jeden Fall vielen Dank für Ihre Hilfe. Edit: Behoben :) Vielen Dank!
Bradly Spicer
Vergessen Sie nicht, das Verzeichnis zu schließen :)
jave.web
15

Die beste Antwort meiner Meinung nach:

$num = count(glob("/exact/path/to/files/" . "*"));
echo $num;
  • Es zählt nicht. und ..
  • Es ist ein Einzeiler
  • Ich bin stolz darauf

quelle
Ich habe gerade festgestellt, dass Sie "Ordner / *" verwenden können, wenn sich Ihr PHP-Dokument im selben Verzeichnis befindet!
Ein Liner sollte Reputationsbelohnungen haben x2 ... tatsächlich machen es x3
baron_bartek
1
Was meinst du? "Es zählt nicht".
Habibhassani
13

Da ich das auch brauchte, war ich gespannt, welche Alternative die schnellste war.

Ich fand heraus, dass Babas Lösung viel schneller ist als die anderen , wenn Sie nur eine Anzahl von Dateien wünschen . 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: (zählt offensichtlich glob()keine Punktdateien)

1: 99 (0.4815571308136 s)
2: 98 (0.96104407310486 s)
3: 99 (0.26513481140137 s)
vbwx
quelle
Welches ist schneller, als Sie das Ergebnis nicht erwähnt haben?
Alex
Ich habe gesagt, dass Babas Lösung am schnellsten ist, aber natürlich hätte ich klarer über die Ergebnisse sein sollen. Jetzt behoben.
VBWX
12

Arbeitsdemo

<?php

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

?>
Nirav Ranpara
quelle
Ich würde es vermeiden, glob () zweimal aufzurufen, wenn Sie viele Dateien im Verzeichnis haben. Stattdessen würde ich das Ergebnis des ersten Globs der Variablen zuweisen und count für diese Variable verwenden.
Konrad Gałęzowski
5

Ich benutze das:

count(glob("yourdir/*",GLOB_BRACE))
Philipp Werminghausen
quelle
Dies ist die erste, die für mich funktioniert, hat jedoch das Problem, dass Sie nicht sicher sein können, dass alle gezählten Dateien Bilder sind.
Sterling Diaz
1
<?php echo(count(array_slice(scandir($directory),2))); ?>

array_slicefunktioniert ähnlich wie eine substrFunktion, nur funktioniert es mit Arrays.

Dies würde beispielsweise die ersten beiden Array-Schlüssel aus dem Array herausschneiden:

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

Und wenn Sie den ersten Parameter wie im ersten Beispiel weglassen, enthält das Array nicht die ersten beiden Schlüssel / Wert-Paare * ('.' Und '..').

Gruslig
quelle
1
Dies ist im Grunde die gleiche Antwort, die bereits von anderen Postern vorgeschlagen wurde. Können Sie Ihre Antwort verbessern oder weitere Informationen hinzufügen, als bereits besprochen wurden?
Joe Miller
Besser .. ? Lassen Sie sie das Handbuch von php.net etwas mehr als gewöhnlich lesen. :)
Spooky
1

Vielleicht nützlich für jemanden. Auf einem Windows-System können Sie Windows die Aufgabe 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 "::"');
Michel
quelle
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";
    } 

Dies sollte funktionieren. Geben Sie das Verzeichnis in dirname ein. und lass die Magie geschehen.

Oussama
quelle
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;
user3121984
quelle
0

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)
    )
)
Panni
quelle
0

Hier ist eine PHP-Linux-Funktion, die sehr schnell ist. Ein bisschen dreckig, aber es erledigt den Job!

$ dir - Pfad zum Verzeichnis

$ type - f, d oder false (standardmäßig)

f - gibt nur die Anzahl der Dateien zurück

d - gibt nur die Anzahl der Ordner zurück

false - Gibt die Gesamtzahl der Dateien und Ordner zurück

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

Sie können an Ihre Bedürfnisse anpassen.

Bitte beachten Sie, dass dies unter Windows nicht funktioniert.

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

Einfach hinzufügen ist fertig ....

parajs dfsb
quelle
Fügen Sie Ihrem Code eine Erklärung hinzu, um ihn klarer zu gestalten.
Alex.K.