PHPディレクトリ内のファイル数を数える


106

少し新しいプロジェクトに取り組んでいます。特定のディレクトリにあるファイルの数を知りたいのですが。

<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そのループのようなイディオムを使用する方が短いでしょう。
マリオ

@マリオ注意! SCANDIRはいいですが、-2はまさに最高ではありません-あなたは、ルートディレクトリにあることができ、または内のディレクトリは、ディレクトリを持つことができます- ローランBrieuは./ ..とディレクトリのための素敵なチェックを持っている :)
jave.web

回答:


261

あなたは単に以下を行うことができます:

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

22
これはかわいいので+1ですが、ほとんどのPHP開発者にとってはかなり混乱していて読みにくいものだと想像できます。私は他の答えのアプローチの1つに行きます。
user428517 2012年

有用ではありましたが、質問をしたとき、それを読むのは簡単ではありませんでした。とはいえ、phpの知識は向上しました。私はこれに賛成していません。
ブラッドリースパイサー、2013

2
質問者が特定のファイルを除外できるようなカスタマイズされたバージョンを必要としない限り、これは受け入れられる答えです。
Abhishek Madhani 14

1
これは一部の開発者にとって混乱を招くと人々が言っ​​ていることを考えると、名前空間を使用している場合(この方法はいずれにしても最新バージョンのPHPが必要であるため)、名前空間も指定する必要があります:$ fi = new \ FilesystemIterator (DIR、\ FilesystemIterator :: SKIP_DOTS);
graemeboy 14

2
FilesystemIterator::SKIP_DOTSとにかくデフォルトなので、フラグを渡す必要はありません。
エボルボブ2018

70

次のようにファイル数を取得できます。

$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''、 'B'、または'C'一致するフラグが膨張{A、B、C}


3
このアプローチには、ファイルをフィルタリングし、それらを数える多くの可能性があります:)単純なループといくつかの条件を作成するのは素晴らしいことです...しかし、そのディレクトリ内に他のディレクトリを含めて、すべてを数える方法などファイルとディレクトリをカウントから除外しますか?
Bumpaster 16

1
で、このSOの質問/答えをチェックアウト@TheBumpaster方法グロブとスキャンサブディレクトリへ:stackoverflow.com/q/12109042/276250
JKirchartz

2
このソリューションが機能しない場合は、__DIR__ . 前に"/path/to/dir/"__DIR__ . "/path/to/dir/")を追加
dnns

@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;?以下のため.だけでなく、..
ハブロック

これらの2つもカウントされることに注意してください。and '..'
Laurent Brieu

7
を取り除き、これ...試すには:$ files =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
OPが最小限のテキストで行った違い/間違いを指摘するのは良いことです(そして何よりも役立つでしょう)。
Havelock

1
やあ、ありがとう。それはまだ私には表示されませんが、私のスタイルシートまたはそれらの線に沿った何かに関係しているのではないかと思います。いずれにせよあなたの助けに感謝します。編集:修正:)どうもありがとうございました!
Bradly Spicer

ディレクトリを閉じることを忘れないでください:)
jave.web '21

16

私の意見では最良の答え:

$num = count(glob("/exact/path/to/files/" . "*"));
echo $num;
  • それは数えません。と..
  • そのワンライナー
  • 私はそれを誇りに思います

PHPドキュメントが同じディレクトリにある場合は、「folder / *」を使用できることに気づきました。

1つのライナーには、評判の報酬x2が必要です...実際にはx3にします
baron_bartek

1
どういう意味ですか?「数えない」。
habibhassani

13

私もこれが必要だったので、どちらの方法が最速か知りたくなりました。

必要なのがファイル数だけの場合、Babaのソリューションは他のソリューションよりもはるかに高速であることがわかりました。びっくりしました。

自分で試してみてください:

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

最後に、結果について言及しなかったのでどちらが速いですか?
Alex

私はババのソリューションが最も速かったと言いましたが、もちろん私は結果についてもっと明確にするべきでした。今修正されました。
vbwx 14

12

作業デモ

<?php

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

?>

ディレクトリに多数のファイルがある場合は、glob()を2回呼び出すことは避けます。代わりに、最初のグロブの結果を変数に割り当て、この変数でカウントを使用します。
KonradGałęzowski、2017


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

array_slicesubstr関数と同様に機能しますが、配列でのみ機能します。

たとえば、これは配列から最初の2つの配列キーを削除します。

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

また、最初の例のように最初のパラメータを省略した場合、配列には最初の2つのキーと値のペア*( '。'と '..')は含まれません。


1
これは基本的に他のポスターですでに提案されているのと同じ答えです。答えを改善したり、すでに説明した以外の情報を追加したりできますか?
Joe Miller

より良い..?php.netのマニュアルを通常より少しだけ読んでもらいます。:)
不気味な

1

多分誰かに役立つ。Windowsシステムでは、dirコマンドを呼び出して、Windowsにジョブを実行させることができます。のような絶対パスを使用します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

これはかなり高速なPHP Linux関数です。少し汚いが、それは仕事を成し遂げる!

$ dir-ディレクトリへのパス

$ type-f、dまたはfalse(デフォルト)

f-ファイル数のみを返します

d-フォルダー数のみを返します

false-ファイルとフォルダの総数を返します

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

ニーズに合わせて調整できます。

これは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);

単純にその完了を追加....


わかりやすくするために、コードに説明を追加します。
Alex.K
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.