ডিরেক্টরি পিএইচপি কত ফাইল আছে তা গণনা করুন


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 কারণ এটি সুন্দর but আমি অন্য উত্তরের একটি পদ্ধতির সাথে যেতে হবে।
ব্যবহারকারী 428517

যদিও দরকারী আমি যখন প্রশ্ন জিজ্ঞাসা করেছি তখন এটি পড়া খুব সহজ ছিল না। যদিও এই বলে, আমি পিএইচপি সম্পর্কে আমার জ্ঞানের উন্নতি করেছি। আমি এই upvated আছে।
ব্র্যাডলি স্পিকার

2
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, যতক্ষণ না প্রশ্নকারী আরও কাস্টমাইজড সংস্করণ না চায়, যেখানে তারা নির্দিষ্ট কিছু ফাইল বাদ দিতে পারে।
অভিষেক মাধানী

1
এই বলে যে লোকেরা এটি কিছু বিকাশকারীদের জন্য বিভ্রান্তিকর বলেছে, আমরা কি যুক্ত করব যে যদি কেউ নামস্পেস ব্যবহার করে থাকে (যেহেতু এই পদ্ধতিটি যে কোনও ক্ষেত্রে পিএইচপি-র সাম্প্রতিক সংস্করণ প্রয়োজন), তবে একটিকে অবশ্যই নামস্থান নির্দিষ্ট করতে হবে: $ ফাই = নতুন \ ফাইলসিসটমিটার ( ডিআইআর , \ ফাইলসিস্টিমেট্রেটর :: এসকেআইপি_ডটস);
গ্রীমবয়

2
FilesystemIterator::SKIP_DOTSযাইহোক, ডিফল্ট হিসাবে আপনাকে পতাকাটিতে পাস করার দরকার নেই ।
ইওরবব

70

আপনি যেমন ফাইলকাউন্ট পেতে পারেন:

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

যেখানে "*"আপনি একটি নির্দিষ্ট filetype: যে পরিবর্তন করতে পারেন যদি আপনি চান চান "*.jpg"বা আপনি ভালো একাধিক বানানটি না পারে:

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

GLOB_BRACEপতাকা বিস্তৃতি {A, B, C} মিলে যাওয়ার 'এ', 'বি', বা 'গ'


3
আশ্চর্যজনক, ফাইলগুলি ফিল্টার করার সাথে সাথে এগুলি গণনা করার জন্য অনেকগুলি সম্ভাবনা রয়েছে :) একটি সাধারণ লুপ তৈরি করা এবং বেশ কয়েকটি শর্ত দুর্দান্ত হবে ... তবে কীভাবে আপনি সেই ডিরেক্টরিগুলির মধ্যে অন্য ডিরেক্টরিগুলি অন্তর্ভুক্ত করতে পারেন এবং সমস্তগুলি গণনা করার জন্য ফাইল এবং ডিরেক্টরি থেকে গণনা থেকে বাদ?
বুম্পাস্টার

1
এই তাই প্রশ্ন / উত্তর খুঁজে বার করো @TheBumpaster কিভাবে উল্লিখিত glob সঙ্গে সাবডিরেক্টরি স্ক্যান করুন: 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__
Justinas

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;? কারণ .সেইসাথে..
Havelock

দ্রষ্টব্য, এটি এই দুটিও গণনা করবে: '।' এবং '..'
লরেন্ট ব্রিউ

7
পরিত্রাণ পেতে .এবং এটি ব্যবহার ..করে দেখুন: $ ফাইলগুলি =array_diff( scandir("/dir"), array(".", "..") );
জে কেরিচার্টজ

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>

এটি একই কোড এবং কাজ করে না: = ফাইল = রিডডির (h ডিএইচ) হওয়া উচিত $ ফাইল = রিডডির (ir দির)
মার্কো পেস

2
সংক্ষিপ্তসার পাঠ্যে ওপি যে পার্থক্য / ভুলগুলি করেছে সেগুলি উল্লেখ করা ভাল (এবং সবার আগে সহায়ক) হবে।
হ্যাভলক

1
এই যে, এই জন্য ধন্যবাদ। এটি এখনও আমার কাছে উপস্থিত হবে না তবে আমি মনে করি যে এটি আমার স্টাইলশীট বা lines লাইনগুলির সাথে কিছু করা উচিত। যে কোনও উপায়ে আপনার সাহায্যের জন্য অনেক ধন্যবাদ। সম্পাদনা: স্থির :) অনেক অনেক ধন্যবাদ!
ব্র্যাডলি স্পিকার 13

ডিরেক্টরিটি বন্ধ করতে ভুলবেন না :)
jave.web

16

আমার মতে সেরা উত্তর:

$num = count(glob("/exact/path/to/files/" . "*"));
echo $num;
  • এটি গণনা করা হয় না। এবং ..
  • এটা ওয়ান লাইনার
  • আমি এটি গর্বিত

ঠিক বুঝতে পেরেছি যদি আপনার পিএইচপি ডকুমেন্ট একই ডিরেক্টরিতে থাকে তবে আপনি "ফোল্ডার / *" ব্যবহার করতে পারবেন!

একটি লাইনারের খ্যাতি পুরষ্কার x2 হওয়া উচিত ... আসলে এটি এক্স 3 করুন
ব্যারন_বারটেক

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 বার গ্লোব () কল করা এড়াতে চাই। পরিবর্তে আমি প্রথম গ্লোব ফলাফল পরিবর্তনশীল মধ্যে নির্ধারিত এবং এই ভেরিয়েবল উপর গণনা ব্যবহার করব।
কনরাড গাজ্জোস্কি


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

array_sliceএকই কাজ করে substrফাংশনের মতো , কেবল এটি অ্যারে নিয়ে কাজ করে।

উদাহরণস্বরূপ, এটি অ্যারে থেকে প্রথম দুটি অ্যারে কীগুলি কেটে ফেলবে:

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

এবং যদি আপনি প্রথম প্যারামিটারটি বাদ দেন, উদাহরণস্বরূপ, অ্যারেতে প্রথম দুটি কী / মান জোড়া * ('।' এবং '..') থাকবে না।


1
এটি ইতিমধ্যে অন্য পোস্টারদের দ্বারা প্রস্তাবিত হিসাবে একই উত্তর। আপনি কি নিজের উত্তরের উন্নতি করতে পারেন, বা ইতিমধ্যে আলোচনা করা হয়েছে এমন কোনও তথ্য যুক্ত করতে পারেন?
জো মিলার

উত্তম .. ? তাদের পিএইচপি.এন.এল ম্যানুয়ালটি স্বাভাবিকের থেকে কিছুটা বেশি পড়ুন। :)
ভুতুড়ে

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

গৃহীত উত্তরের উপর ভিত্তি করে, এখানে একটি ডিরেক্টরিতে সমস্ত ফাইল গণনা করার একটি উপায় এখানে রয়েছে:

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

0

এখানে একটি পিএইচপি লিনাক্স ফাংশন যা যথেষ্ট দ্রুতগতির। কিছুটা নোংরা, তবে কাজটা হয়ে যায়!

ir dir - ডিরেক্টরিতে পাথ

$ প্রকার - এফ, ডি বা মিথ্যা (ডিফল্টরূপে)

f - কেবল ফাইল গণনা প্রদান করে

d - কেবল ফোল্ডার গণনা প্রদান করে

মিথ্যা - মোট ফাইল এবং ফোল্ডার গণনা প্রদান করে

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

সহজ এটি সম্পন্ন ....


আপনার কোডটি আরও পরিষ্কার করার জন্য কিছু ব্যাখ্যা যুক্ত করুন।
অ্যালেক্স.কে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.