PHP dizininde kaç dosya olduğunu sayın


108

Biraz yeni bir proje üzerinde çalışıyorum. Belirli bir dizinde kaç dosya olduğunu bilmek istedim.

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

Şu ana kadar sahip olduğum şey bu (aramaktan). Ancak, düzgün görünmüyor mu? Birkaç not ekledim, bu yüzden onları kaldırmakta özgürsünüz, elimden geldiğince iyi anlayabilmem için öyle.

Daha fazla bilgiye ihtiyacınız varsa veya bunu yeterince açıklamamış gibi hissediyorsanız, lütfen bunu belirtmekten çekinmeyin.


4
Böyle bir deyimi kullanmak count(scandir("uploads/")) - 2bu döngüden daha kısa olacaktır .
mario

@mario Dikkatli! scandir güzel, ancak -2 tam olarak en iyisi değil - bir kök dizinde olabilirsiniz veya dizinde dizinler olabilir - Laurent Brieu'nun ./ .. ve dizinler için güzel bir kontrolü var :)
jave.web

Yanıtlar:


263

Aşağıdakileri basitçe yapabilirsiniz:

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

22
+1 çünkü bu sevimli, ancak çoğu PHP geliştiricisi için oldukça kafa karıştırıcı / okunamaz olduğunu hayal edebiliyorum. Diğer cevaplardaki yaklaşımlardan biriyle giderdim.
user428517

Yararlı olmasına rağmen soruyu sorduğumda okumak çok kolay olmadı. Bunu söyleyerek php bilgimi geliştirdim. Ben buna olumlu oy vermedim.
Bradly Spicer

2
Soruyu soran kişi belirli dosyaları dışlayabileceği daha özelleştirilmiş bir sürüm istemediği sürece, bu kabul edilen yanıt olmalıdır.
Abhishek Madhani

1
İnsanların bunun bazı geliştiriciler için kafa karıştırıcı olduğunu söylediği göz önüne alındığında, ad alanları kullanılıyorsa (bu yöntem her durumda PHP'nin son sürümünü gerektirdiğinden), o zaman ad alanını da belirtmek gerektiğini eklemeliyiz: $ fi = new \ FilesystemIterator ( DIR , \ FilesystemIterator :: SKIP_DOTS);
graemeboy

2
FilesystemIterator::SKIP_DOTSZaten varsayılan olduğu için bayrağı geçirmenize gerek yok .
Eborbob

70

Dosya sayısını şu şekilde alabilirsiniz:

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

nerede "*"olduğunu sizin gibi isterseniz belirli bir filetype o değiştirebilir "*.jpg"veya bu gibi birden filetypes yapabilirdi:

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

GLOB_BRACE'a', 'b', veya 'c' eşleşmeye uygun genişler {a, b, c}


3
Harika, bu yaklaşımla dosyaları filtrelemek ve onları saymak için pek çok olasılık var :) Basit bir döngü ve çeşitli koşullar oluşturmak harika olurdu ... Ama diğer dizinleri bu dizinlere nasıl dahil edebilirsiniz ve bu şekilde hepsini sayabilirsiniz dosyalar ve dizinler sayıdan çıkarılsın mı?
Bumpaster

1
@TheBumpaster glob ile alt dizinlerin nasıl taranacağına dair bu SO sorusuna / yanıtlarına
göz atın

2
Bu çözüm kim için işe yaramazsa, ( )__DIR__ . "/path/to/dir/"__DIR__ . "/path/to/dir/"
dnns

@dnns Aslında bir şey eklemek /path/to/dirbaşarısız olur, çünkü ilk /demektir starting from root dir. Olsaydı path/to/dir, o zaman evet, __DIR__ . '/path/to/dir'bu durumda kullanmalısınız (yardımcı olacağını /sonrası__DIR__
Justinas

43

Bunu dene.

// Directory
$directory = "/dir";

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

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

'.' Sayılmaz. ve '..'.


5
Belki $num_files = count($files) - 2;? .Hem yüzünden..
Havelock

Bu ikisini de sayacağını unutmayın: '.' ve '..'
Laurent Brieu

7
kurtulmak .ve bunu ..denemek için: $ files =array_diff( scandir("/dir"), array(".", "..") );
JKirchartz

2
array_slice(scandir($directory),2)
Spooky

42

Sahip olmalıdır :

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

aynı kod ve çalışmıyor: $ dosya = readdir ($ dh) $ dosya = readdir ($ dir) olmalıdır
Marco Pace

2
OP'nin minimalist bir metinde yaptığı farklılıkları / hataları belirtmek güzel (ve her şeyden önce yardımcı olur).
Havelock

1
Merhaba, bunun için teşekkürler. Hala benim için görünmeyecek, ancak bunun stil sayfamla veya bu çizgilerdeki bir şeyle ilgili olabileceğini düşünüyorum. Her halükarda yardımın için çok teşekkürler. Düzenleme: Sabit :) Çok teşekkürler!
Bradly Spicer

Dizini kapatmayı unutmayın :)
jave.web

16

Bence en iyi cevap:

$num = count(glob("/exact/path/to/files/" . "*"));
echo $num;
  • Sayılmaz. ve ..
  • Tek astarlı
  • Bundan gurur duyuyorum

PHP belgeniz aynı dizindeyse "klasör / *" kullanabileceğinizi fark ettim!

Bir gömlekleri aslında x3 yapmak ... itibar ödülleri x2 olmalıdır
baron_bartek

1
Ne demek istiyorsun? "Sayılmaz".
habibhassani

13

Buna da ihtiyacım olduğu için hangi alternatifin en hızlı olduğunu merak ediyordum.

Buldum ki - tek istediğiniz bir dosya sayımı ise - Baba'nın çözümü diğerlerinden çok daha hızlı. Oldukça şaşırdım.

Kendiniz deneyin:

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

Test çalıştırması: (açıkça glob()nokta dosyalarını saymaz)

1: 99 (0.4815571308136 s)
2: 98 (0.96104407310486 s)
3: 99 (0.26513481140137 s)

Sonunda, sonuçtan bahsetmediğiniz için hangisi daha hızlıdır?
Alex

Baba'nın çözümünün en hızlı olduğunu söyledim, ama tabii ki sonuçlar konusunda daha net olmalıydım. Şimdi düzeltildi.
vbwx

12

Çalışma Demosu

<?php

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

?>

Dizinde çok fazla dosyanız varsa glob () 'u 2 kez çağırmaktan kaçınırım. Bunun yerine, ilk glob'un sonucunu değişkene atar ve bu değişken için count kullanırdım.
Konrad Gałęzowski

5

Bunu kullanıyorum:

count(glob("yourdir/*",GLOB_BRACE))

Bu benim için çalışan ilk şey, ancak sorun olarak, sayılan tüm dosyaların resim olduğuna dair size güvence vermiyor.
Sterling Diaz

1
<?php echo(count(array_slice(scandir($directory),2))); ?>

array_slicesubstrişlev gibi çalışır, yalnızca dizilerle çalışır.

Örneğin, bu, diziden ilk iki dizi anahtarını keser:

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

Ve ilk örnekte olduğu gibi, ilk parametreyi atlarsanız, dizi ilk iki anahtar / değer çiftini * ('.' Ve '..') içermez.


1
Bu, temelde diğer posterler tarafından önerilen cevapla aynıdır. Cevabınızı iyileştirebilir misiniz veya daha önce tartışılandan başka bilgi ekleyebilir misiniz?
Joe Miller

Daha iyi .. ? Her zamankinden biraz daha fazla php.net kılavuzunu okumalarına izin verin. :)
Spooky

1

Belki birisi için yararlıdır. Bir Windows sisteminde, dir-komutunu çağırarak Windows'un işi yapmasına izin verebilirsiniz. Mutlak bir yol kullanıyorum, mesela 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";
    } 

Bu çalışmalıdır dizini dizin adı içine girin. ve sihrin olmasına izin verin.


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

Kabul edilen yanıta dayalı olarak, bir dizindeki tüm dosyaları TEKRARLANABİLİR ŞEKİLDE saymanın bir yolu:

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

0

İşte oldukça hızlı bir PHP Linux işlevi. Biraz kirli, ama işi hallediyor!

$ dir - dizine giden yol

$ type - f, d veya false (varsayılan olarak)

f - yalnızca dosya sayısını döndürür

d - yalnızca klasör sayısını döndürür

false - toplam dosya ve klasör sayısını döndürür

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

İhtiyaçlarınıza uyacak şekilde ince ayar yapabilirsiniz.

Lütfen bunun Windows'ta çalışmayacağını unutmayın.


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

basit tamamlandı ....


Daha anlaşılır hale getirmek için kodunuza bazı açıklamalar ekleyin.
Alex.K.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.