निर्देशिका PHP में कितनी फाइलें गिनें


107

मैं थोड़ा नए प्रोजेक्ट पर काम कर रहा हूं। मैं जानना चाहता था कि एक निश्चित निर्देशिका में कितनी फाइलें हैं।

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

यह वही है जो मैंने अभी तक (खोज से) किया है। हालाँकि, यह ठीक से दिखाई नहीं दे रहा है? मैंने कुछ नोट्स जोड़े हैं ताकि उन्हें हटाने के लिए स्वतंत्र महसूस करें, वे सिर्फ इसलिए मैं इसे सबसे अच्छा समझ सकता हूं जितना मैं कर सकता हूं।

यदि आपको कुछ और जानकारी की आवश्यकता है या ऐसा लगता है जैसे मैंने इसे पर्याप्त रूप से वर्णित नहीं किया है, तो कृपया ऐसा करने के लिए स्वतंत्र महसूस करें।


4
count(scandir("uploads/")) - 2उस लूप की तुलना में एक मुहावरे का उपयोग करना कम होगा ।
मारियो

@ मोरियो सावधान! स्कैंडिर अच्छा है, लेकिन -2 सबसे अच्छा नहीं है - आप एक रूट डायरेक्टरी में हो सकते हैं या डायरेक्टरी के अंदर डायरेक्टरी हो सकती है - लॉरेंट
ब्रीयू के

जवाबों:


262

आप बस निम्नलिखित कर सकते हैं:

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

22
+1 क्योंकि यह प्यारा है, लेकिन मैं कल्पना कर सकता हूं कि यह अधिकांश PHP देवों के लिए काफी भ्रमित / अपठनीय है। मैं अन्य उत्तरों में से एक दृष्टिकोण के साथ जाऊंगा।
user428517

हालांकि उपयोगी यह बहुत आसान नहीं था जब मैंने सवाल पूछा। यह कहते हुए कि, मैंने php के अपने ज्ञान में सुधार किया है। मैंने इसका कोई उत्थान नहीं किया है।
ब्रैडली स्पाइसर

2
यह स्वीकृत उत्तर होना चाहिए, जब तक कि पूछने वाला अधिक अनुकूलित संस्करण नहीं चाहता है, जहां वे कुछ फाइलों को बाहर कर सकते हैं।
अभिषेक माधनी

1
यह देखते हुए कि लोग कह रहे हैं कि यह कुछ डेवलपर्स के लिए भ्रामक है, क्या हमें यह जोड़ना चाहिए कि यदि कोई नामस्थान का उपयोग कर रहा है (क्योंकि इस विधि को किसी भी स्थिति में PHP के हाल के संस्करण की आवश्यकता है), तो किसी को नामस्थान भी निर्दिष्ट करना होगा: $ fi = new \ Filesystemsterator ( DIR , \ FilesystemIterator :: SKIP_DOTS);
ग्रीमेबॉय

2
FilesystemIterator::SKIP_DOTSवैसे भी डिफ़ॉल्ट रूप से आपको ध्वज में पास होने की आवश्यकता नहीं है।
Eborbob

70

आप इस तरह filecount प्राप्त कर सकते हैं:

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

जहां "*"है आप एक विशिष्ट फ़ाइल प्रकार है कि बदल सकते हैं अगर आप की तरह चाहते हैं "*.jpg"या आप इस तरह कई फ़ाइल प्रकार कर सकता है:

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

GLOB_BRACEझंडा फैलता {एक, ख, ग} मिलान के 'एक', 'बी', या 'सी'


3
बहुत बढ़िया, फ़ाइलों को फ़िल्टर करने के लिए इस दृष्टिकोण के साथ बहुत सारी संभावनाएं हैं और उन्हें गिनना :) एक सरल लूप बनाना और कई स्थितियां महान होंगी ... लेकिन आप सभी निर्देशिकाओं के भीतर अन्य निर्देशिकाओं को कैसे शामिल कर सकते हैं और सभी को गिनने के लिए। फ़ाइलों और गिनती से निर्देशिका को बाहर?
बम्पस्टर जूल

1
@ TheBumpaster ने इस SO प्रश्न / उत्तर की जाँच की कि कैसे ग्लोब के साथ उपनिर्देशिका को स्कैन किया जाए: stackoverflow.com/q/12109042/276250
JKirchartz

2
जिनके लिए यह समाधान काम नहीं करता है, __DIR__ . "/path/to/dir/"__DIR__ . "/path/to/dir/"
उनसे

@dnns वास्तव में कुछ भी जोड़ना /path/to/dirइसे विफल कर देगा, क्योंकि पहले का /मतलब है starting from root dir। अगर वहाँ थे path/to/dir, तो हाँ, __DIR__ . '/path/to/dir'मदद करेगा (इस मामले में आप के /बाद उपयोग करना चाहिए__DIR__
जस्टिनस

43

इसे इस्तेमाल करे।

// Directory
$directory = "/dir";

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

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

गिनती नहीं '।' तथा '..'।


5
हो सकता है $num_files = count($files) - 2;? कारण .के रूप में भी..
हैवलॉक

ध्यान दें, यह इन दोनों को भी गिनाएगा: '।' और '..'
लॉरेंट ब्रीयू

7
से छुटकारा पाने के लिए .और ..इस कोशिश: $ फ़ाइलें =array_diff( scandir("/dir"), array(".", "..") );
JKirchartz

2
array_slice(scandir($directory),2)
स्पूकी

42

आपको होना चाहिए :

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

यह एक ही कोड है और काम नहीं करता है: $ file = readdir ($ dh) $ file = readdir ($ dir) होनी चाहिए
Marco Pace

2
ओपी ने एक न्यूनतर पाठ में अंतर / गलतियों को इंगित करने के लिए अच्छा (और सभी से पहले सहायक) होगा।
हैवलॉक

1
अरे, इसके लिए धन्यवाद। यह अभी भी मेरे लिए प्रकट नहीं होगा, लेकिन मुझे लगता है कि मेरी स्टाइलशीट या उन लाइनों के साथ कुछ करना हो सकता है। किसी भी तरह से आपकी मदद के लिए बहुत बहुत धन्यवाद। संपादित करें: फिक्स्ड :) बहुत बहुत धन्यवाद!
ब्रैडली स्पाइसर

डायरेक्टरी को बंद करना न भूलें :)
jave.web

16

मेरी राय में सबसे अच्छा जवाब:

$num = count(glob("/exact/path/to/files/" . "*"));
echo $num;
  • यह मायने नहीं रखता है। तथा ..
  • इसका एक लाइनर है
  • मुझे इस पर गर्व है

बस एहसास हुआ कि आप "फ़ोल्डर / *" का उपयोग कर सकते हैं यदि आपका PHP दस्तावेज़ उसी निर्देशिका में है!

एक लाइनर में प्रतिष्ठा पुरस्कार x2 होना चाहिए ... वास्तव में इसे x3
बनायें

1
आपका क्या अर्थ है? "यह गिनती नहीं है"।
हबीबसानी

13

चूंकि मुझे इसकी भी आवश्यकता थी, इसलिए मैं उत्सुक था कि कौन सा विकल्प सबसे तेज था।

मैंने पाया कि - यदि आप चाहते हैं कि एक फ़ाइल गिनती है - बाबा का समाधान दूसरों की तुलना में बहुत तेज है। मैं काफी हैरान था।

इसे स्वयं के लिए प्रयास करें:

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

टेस्ट रन: (जाहिर है, glob()डॉट-फाइल की गिनती नहीं करता है)

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

अंत में कौन सा तेज है जैसा कि आपने परिणाम का उल्लेख नहीं किया है?
एलेक्स

मैंने कहा कि बाबा का समाधान सबसे तेज़ था, लेकिन निश्चित रूप से मुझे परिणामों के बारे में स्पष्ट होना चाहिए था। अभी तय किया है।
vbwx

12

वर्किंग डेमो

<?php

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

?>

अगर आपके पास निर्देशिका में बहुत सारी फाइलें हैं, तो मैं ग्लोब () को 2 बार कॉल करने से बचूंगा। इसके बजाय मैं चर में पहले ग्लोब का परिणाम बताऊंगा और इस चर पर गिनती का उपयोग करूंगा।
कोनराड Ga Kon Konzowski

5

मैं इसका उपयोग करता हूं:

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

यह पहला है जो मेरे लिए काम करता है, लेकिन समस्या यह है कि यह आपको आश्वासन नहीं देता है कि गिने गए सभी फाइलें छवियां हैं।
स्टर्लिंग डियाज़

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

array_slicesubstrफ़ंक्शन की तरह सिमिलरी कार्य करता है, केवल यह सरणियों के साथ काम करता है।

उदाहरण के लिए, यह सरणी से पहली दो सरणी कुंजियों को काट देगा:

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

और यदि आप पहले पैरामीटर को पसंद करते हैं, जैसे पहले उदाहरण में, सरणी में पहले दो कुंजी / मूल्य जोड़े * ('।' और '..') नहीं होंगे।


1
यह मूल रूप से एक ही उत्तर है जैसा कि पहले से ही अन्य पोस्टर द्वारा प्रस्तावित किया गया है। क्या आप अपने जवाब में सुधार कर सकते हैं, या पहले से चर्चा की गई जानकारी के अलावा कोई और जानकारी जोड़ सकते हैं?
जो मिलर

बेहतर है ..? उन्हें php.net मैनुअल को सामान्य से थोड़ा अधिक पढ़ने दें। :)
डरावना

1

शायद किसी के लिए उपयोगी। विंडोज सिस्टम पर, आप डीर-कमांड को कॉल करके विंडोज को काम करने दे सकते हैं। मैं एक पूर्ण पथ का उपयोग करता हूं, जैसे 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";
    } 

यह काम निर्देशिका को dirname में दर्ज करना चाहिए। और जादू होने दो।


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

स्वीकृत उत्तर के आधार पर, यहाँ एक निर्देशिका RECURSIVELY में सभी फाइलों को गिनने का तरीका दिया गया है:

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

0

यहाँ एक PHP लिनक्स फंक्शन है जो काफी तेज है। थोड़ा गंदा, लेकिन यह काम हो जाता है!

$ dir - निर्देशिका का मार्ग

$ प्रकार - एफ, डी या गलत (डिफ़ॉल्ट रूप से)

f - रिटर्न केवल फाइलों की गिनती है

डी - रिटर्न केवल फ़ोल्डर्स की गिनती

गलत - कुल फ़ाइलों और फ़ोल्डरों की गणना करता है

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

आप अपनी आवश्यकताओं के अनुसार फिट हो सकते हैं।

कृपया ध्यान दें कि यह विंडोज पर काम नहीं करेगा।


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

सरल जोड़ दिया गया है ...


इसे स्पष्ट करने के लिए अपने कोड में कुछ स्पष्टीकरण जोड़ें।
एलेक्स।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.