web-dev-qa-db-ja.com

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

私は少し新しいプロジェクトに取り組んでいます。特定のディレクトリにあるファイルの数を数えるようにする方法を知りたかった。

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

これは私がこれまでのところ(検索から)持っているものです。ただし、正しく表示されませんか?いくつかのメモを追加したので、気軽に削除してください。できるだけ理解できるようになっています。

さらに情報が必要な場合や、これについて十分に説明していないように感じる場合は、お気軽にその旨をお伝えください。

91
Bradly Spicer

次のことが簡単にできます。

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

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

$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フラグは、「a」、「b」、または「c」に一致するように{a、b、c}を展開します

60
JKirchartz

あなたが持っている必要があります:

<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>
42
Laurent Brieu

これを試して。

// Directory
$directory = "/dir";

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

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

「。」は数えませんおよび「..」。

39
intelis

ワーキングデモ

<?php

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

?>
12
Nirav Ranpara

私もこれが必要だったので、どの選択肢が最速であるかについて興味がありました。

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

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

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

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

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

私はこれを使用します:

count(glob("yourdir/*",GLOB_BRACE))
<?php echo(count(array_slice(scandir($directory),2))); ?>

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

たとえば、これにより、配列から最初の2つの配列キーが切り出されます。

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

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

1
Spooky

誰かに役立つかもしれません。 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 "::"');
1
Michel
$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
oussama

受け入れられた答えに基づいて、ディレクトリ内のすべてのファイルを再帰的にカウントする方法を次に示します。

iterator_count(
    new \RecursiveIteratorIterator(
        new \RecursiveDirectoryIterator('/your/directory/here/', \FilesystemIterator::SKIP_DOTS)
    )
)
0
Panni
$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
user3121984