Hitung berapa banyak file di direktori PHP

108

Saya sedang mengerjakan proyek yang sedikit baru. Saya ingin tahu berapa banyak file di direktori tertentu.

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

Inilah yang saya miliki sejauh ini (dari pencarian). Namun, itu tidak muncul dengan benar? Saya telah menambahkan beberapa catatan jadi jangan ragu untuk menghapusnya, hanya agar saya dapat memahaminya sebaik mungkin.

Jika Anda memerlukan beberapa informasi lebih lanjut atau merasa seolah-olah saya belum cukup menjelaskan hal ini, silakan menyatakannya.

Bradly Spicer
sumber
4
Akan lebih pendek menggunakan idiom seperti itu count(scandir("uploads/")) - 2daripada loop itu.
mario
@mario Hati-hati! scandir memang bagus, tetapi -2 bukanlah yang terbaik - Anda dapat berada di direktori root atau direktori dapat memiliki direktori di dalamnya - Laurent Brieu memiliki pemeriksaan yang bagus untuk ./ .. dan direktori :)
jave.web

Jawaban:

263

Anda cukup melakukan hal berikut:

$fi = new FilesystemIterator(__DIR__, FilesystemIterator::SKIP_DOTS);
printf("There were %d Files", iterator_count($fi));
Baba
sumber
22
+1 karena ini lucu, tetapi saya dapat membayangkannya cukup membingungkan / tidak dapat dibaca untuk sebagian besar pengembang PHP. Saya akan menggunakan salah satu pendekatan di jawaban lainnya.
pengguna428517
Meskipun bermanfaat, itu tidak mudah dibaca ketika saya mengajukan pertanyaan. Mengatakan itu, saya telah meningkatkan pengetahuan saya tentang php. Saya tidak memberi suara positif untuk ini.
Bradly Spicer
2
Ini harus menjadi jawaban yang diterima, kecuali penanya menginginkan versi yang lebih disesuaikan, di mana mereka dapat mengecualikan file tertentu.
Abhishek Madhani
1
Mengingat bahwa orang mengatakan ini membingungkan bagi beberapa pengembang, haruskah kita menambahkan bahwa jika seseorang menggunakan ruang nama (karena metode ini membutuhkan versi PHP terbaru dalam hal apa pun), maka kita juga harus menentukan ruang nama: $ fi = new \ FilesystemIterator ( DIR , \ FilesystemIterator :: SKIP_DOTS);
graemeboy
2
Anda tidak perlu meneruskan bendera FilesystemIterator::SKIP_DOTSkarena itu adalah default.
Eborbob
70

Anda bisa mendapatkan filecount seperti ini:

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

di mana "*"adalah Anda dapat mengubahnya menjadi jenis file tertentu jika Anda mau "*.jpg"atau Anda dapat melakukan beberapa jenis file seperti ini:

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

yang GLOB_BRACEmengembang bendera {a, b, c} untuk pertandingan 'a', 'b', atau 'c'

JKirchartz
sumber
3
Luar biasa, ada banyak kemungkinan dengan pendekatan ini untuk memfilter file serta menghitungnya :) Membuat loop sederhana dan beberapa kondisi akan sangat bagus ... Tapi bagaimana Anda bisa memasukkan direktori lain ke dalam direktori itu dan seterusnya untuk menghitung semua file dan mengecualikan direktori dari hitungan?
The Bumpaster
1
@TheBumpaster lihat pertanyaan / jawaban SO ini tentang cara memindai subdirektori dengan glob: stackoverflow.com/q/12109042/276250
JKirchartz
2
Untuk siapa solusi ini tidak berhasil, tambahkan __DIR__ . sebelum "/path/to/dir/"( __DIR__ . "/path/to/dir/")
dnns
@dnns Sebenarnya menambahkan apa pun ke /path/to/dirakan gagal, karena /artinya pertama starting from root dir. Jika ada path/to/dir, maka ya, __DIR__ . '/path/to/dir'akan membantu (dalam hal ini Anda harus menggunakan /setelah__DIR__
Justinas
43

Coba ini.

// Directory
$directory = "/dir";

// Returns array of files
$files = scandir($directory);

// Count number of files and store them to variable..
$num_files = count($files)-2;

Tidak menghitung '.' dan '..'.

intelis
sumber
5
Mungkinkah $num_files = count($files) - 2;? Karena .juga..
Havelock
Perhatikan, bahwa itu juga akan menghitung dua hal berikut: '.' dan '..'
Laurent Brieu
7
untuk menyingkirkan .dan ..coba ini: $ files =array_diff( scandir("/dir"), array(".", "..") );
JKirchartz
2
array_slice(scandir($directory),2)
Seram
42

Kamu harus punya :

<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
sumber
itu adalah kode yang sama dan tidak berfungsi: $ file = readdir ($ dh) harus $ file = readdir ($ dir)
Marco Pace
2
Alangkah baiknya (dan membantu sebelumnya) untuk menunjukkan perbedaan / kesalahan yang telah dibuat OP dalam teks minimalis.
Havelock
1
Halo, terima kasih untuk ini. Itu masih tidak akan muncul untuk saya tetapi saya merasa itu mungkin ada hubungannya dengan stylesheet saya atau sesuatu di sepanjang garis itu. Bagaimanapun, terima kasih banyak atas bantuan Anda. Edit: Tetap :) Terima kasih banyak!
Bradly Spicer
Jangan lupa tutup direktorinya :)
jave.web
16

Jawaban terbaik menurut saya:

$num = count(glob("/exact/path/to/files/" . "*"));
echo $num;
  • Itu tidak dihitung. dan ..
  • Ini satu kapal
  • Aku bangga dengan ini

sumber
Baru sadar Anda dapat menggunakan "folder / *" jika dokumen PHP Anda ada di direktori yang sama!
Satu liners harus memiliki penghargaan reputasi x2 ... benar-benar membuatnya x3
baron_bartek
1
Maksud kamu apa? "Itu tidak dihitung".
habibhassani
13

Karena saya membutuhkan ini juga, saya ingin tahu alternatif mana yang paling cepat.

Saya menemukan bahwa - jika yang Anda inginkan hanyalah jumlah file - solusi Baba adalah banyak lebih cepat daripada yang lain. Saya cukup terkejut.

Cobalah sendiri:

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

Uji coba: (jelas, glob()tidak menghitung file titik)

1: 99 (0.4815571308136 s)
2: 98 (0.96104407310486 s)
3: 99 (0.26513481140137 s)
vbwx.dll
sumber
Akhirnya mana yang lebih cepat karena Anda tidak menyebutkan hasilnya?
Alex
Saya memang mengatakan bahwa solusi Baba adalah yang tercepat, tetapi tentu saja saya seharusnya lebih jelas tentang hasilnya. Diperbaiki sekarang.
vbwx
12

Bekerja Demo

<?php

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

?>
Nirav Ranpara
sumber
Saya akan menghindari panggilan glob () 2 kali jika Anda memiliki banyak file dalam direktori. Sebagai gantinya saya akan menetapkan hasil glob pertama ke dalam variabel dan menggunakan jumlah pada variabel ini.
Konrad Gałęzowski
5

Saya menggunakan ini:

count(glob("yourdir/*",GLOB_BRACE))
Philipp Werminghausen
sumber
Ini adalah yang pertama yang berhasil untuk saya, tetapi memiliki masalah yang tidak memberi Anda jaminan bahwa semua file yang dihitung adalah gambar.
Sterling Diaz
1
<?php echo(count(array_slice(scandir($directory),2))); ?>

array_slicebekerja sama seperti substrfungsi, hanya bekerja dengan array.

Misalnya, ini akan memotong dua kunci array pertama dari array:

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

Dan jika Anda mengabaikan parameter pertama, seperti pada contoh pertama, array tidak akan berisi dua pasangan kunci / nilai pertama * ('.' Dan '..').

Menyeramkan
sumber
1
Ini pada dasarnya adalah jawaban yang sama seperti yang telah diajukan oleh poster lainnya. Dapatkah Anda memperbaiki jawaban Anda, atau menambahkan lebih banyak informasi selain yang telah dibahas?
Joe Miller
Lebih baik ..? Biarkan mereka membaca manual php.net sedikit lebih banyak dari biasanya. :)
Seram
1

Mungkin berguna bagi seseorang. Pada sistem Windows, Anda dapat membiarkan Windows melakukan pekerjaan dengan memanggil perintah dir. Saya menggunakan jalur absolut, seperti E:/mydir/mysubdir.

<?php 
$mydir='E:/mydir/mysubdir';
$dir=str_replace('/','\\',$mydir);
$total = exec('dir '.$dir.' /b/a-d | find /v /c "::"');
Michel
sumber
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";
    } 

Ini harus bekerja masuk direktori di dirname. dan biarkan keajaiban terjadi.

oussama
sumber
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;
pengguna3121984
sumber
0

Berdasarkan jawaban yang diterima, berikut adalah cara untuk menghitung semua file dalam direktori SECARA REKUR:

iterator_count(
    new \RecursiveIteratorIterator(
        new \RecursiveDirectoryIterator('/your/directory/here/', \FilesystemIterator::SKIP_DOTS)
    )
)
Panni
sumber
0

Berikut adalah fungsi PHP Linux yang sangat cepat. Sedikit kotor, tapi itu menyelesaikan pekerjaan!

$ dir - path ke direktori

$ type - f, d atau false (secara default)

f - hanya mengembalikan jumlah file

d - hanya mengembalikan hitungan folder

false - mengembalikan jumlah file dan folder

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

Anda dapat menyesuaikan agar sesuai dengan kebutuhan Anda.

Harap dicatat bahwa ini tidak akan berfungsi di Windows.

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

sederhana tambahkan selesai ....

parajs dfsb
sumber
tambahkan beberapa penjelasan ke kode Anda untuk membuatnya lebih jelas.
Alex.K.