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.


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

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'


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


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>

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

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)

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

?>

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

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


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

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.


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;

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

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.


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


tambahkan beberapa penjelasan ke kode Anda untuk membuatnya lebih jelas.
Alex.K.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.