计算目录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比该循环要短。
马里奥

@mario 小心! scandir很不错,但是-2并不是最好的-您可以在根目录中,也可以在目录中包含目录-Laurent Brieu可以很好地检查./ ..和目录:)
jave.web

Answers:


261

您可以简单地执行以下操作:

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

22
+1是因为它很可爱,但是我可以想象对于大多数PHP开发人员来说,它相当令人困惑/难以理解。我会选择其他答案中的一种方法。
user428517 2012年

尽管很有用,但当我问这个问题时,阅读起来并不容易。话虽如此,但我已经提高了对php的了解。我没有对此表示赞同。
Bradly Spicer

2
除非要求者需要更多定制版本,否则他们可以排除某些文件,这应该是可接受的答案。
Abhishek Madhani 2014年

1
鉴于人们对某些开发人员而言这令人困惑,我们是否应该补充一点,如果一个人正在使用名称空间(因为在任何情况下此方法都需要PHP的最新版本),则还必须指定名称空间:$ fi = new \ FilesystemIterator (DIR,\ FilesystemIterator :: SKIP_DOTS);
graemeboy 2014年

2
您无需传递标志,FilesystemIterator::SKIP_DOTS因为这是默认设置。
Eborbob

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标志膨胀{A,B,C},以匹配'A', 'B',或'c'的


3
太棒了,这种方法有很多可能性来过滤文件并对其进行计数:)创建一个简单的循环,好几个条件都可以...但是如何在该目录中包含其他目录,以此类推文件并从计数中排除目录?
The Bumpaster '16

1
@TheBumpaster查看有关如何使用glob扫描子目录的以下问题/解答:stackoverflow.com/q/12109042/276250
JKirchartz '16

2
对于__DIR__ . "/path/to/dir/"__DIR__ . "/path/to/dir/"
无法解决

@dnns实际上添加任何东西/path/to/dir都会使它失败,因为first /意味着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

请注意,它还将计算这两个:“。” 和“ ..”
Laurent Brieu,2012年

7
摆脱...尝试以下操作:$ files =array_diff( scandir("/dir"), array(".", "..") );
JKirchartz

1
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 2012年

2
指出OP在简约文本中所犯的差异/错误将是很好的(并且首先是有帮助的)。
哈夫洛克

1
嘿,谢谢。对于我来说,它仍然不会出现,但是我认为这可能与我的样式表或类似内容有关。无论哪种方式,都非常感谢您的帮助。编辑:固定:)非常感谢!
Bradly Spicer

不要忘记关闭目录:)
jave.web

16

我认为最好的答案是:

$num = count(glob("/exact/path/to/files/" . "*"));
echo $num;
  • 它不算数。和..
  • 其一班轮
  • 我为此感到骄傲

刚意识到,如果您的PHP文档位于同一目录中,则可以使用“ folder / *”!

一个班轮应该有x2的声望奖励……实际上是x3的声望
baron_bartek19年

1
你什么意思?“不算数”。
habibhassani

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)

最后,您没有提到结果哪个更快?
2014年

我确实说过,Baba的解决方案是最快的,但是我当然应该更加清楚结果。立即修复。
vbwx

12

工作演示

<?php

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

?>

如果目录中有很多文件,我将避免调用glob()2次。相反,我将第一个glob的结果分配给变量并在此变量上使用count。
KonradGałęzowski17年


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

array_slice 相似的作品 substr函数工作,仅适用于数组。

例如,这将从数组中切出前两个数组键:

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

而且,如果像第一个示例一样省略了第一个参数,则数组将不包含前两个键/值对*('。'和'..')。


1
这基本上与其他张贴者已经提出的答案相同。除了已经讨论过的内容之外,您是否可以改善答案或添加更多信息?
乔·米勒

更好..?让他们比平常多阅读php.net手册。:)
Spooky

1

也许对某人有用。在Windows系统上,可以让Windows通过调用dir命令来完成此工作。我使用绝对路径,例如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";
    } 

这应该可以在目录名中输入目录。并让魔术发生。


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.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.