[英]How to count number of files in a directory using PHP?
如何使用PHP计算目录中的文件数?
请回答以下问题:
1.递归搜索 :该目录(正在搜索)可能具有其他几个目录和文件。
2.非递归搜索 :所有目录都应忽略,这些目录都位于要搜索的目录内。 仅考虑文件。
我有以下代码,但正在寻找更好的解决方案。
<?php
$files = array();
$dir = opendir('./items/2/l');
while(($file = readdir($dir)) !== false)
{
if($file !== '.' && $file !== '..' && !is_dir($file))
{
$files[] = $file;
}
}
closedir($dir);
//sort($files);
$nooffiles = count($files);
?>
递归:
$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
$count = 0;
while($it->next()) $count++;
尽管可以使用PHP的glob文件系统功能来缩短“非递归搜索”的工作方式,但大多数提到的方法都可以使用。
它基本上找到与模式匹配的路径名,因此可以用作:
$count = 0;
foreach (glob('path\to\dir\*.*') as $file) {
$count++;
}
点号前的星号表示文件名,而后号表示文件扩展名。 因此,它的用途可以进一步扩展到对具有特定文件名,特定扩展名或两者的文件计数。
$dir = opendir('dir/');
$i = 0;
while (false !== ($file = readdir($dir))){
if (!in_array($file, array('.', '..' ))and (!is_dir($file)))
$i++;
}
echo "There were $i files";
非recrusive:
$dir = opendir('dir/');
$i = 0;
while (false !== ($file = readdir($dir))){
if (!in_array($file, array('.', '..') and !is_dir($file)) $i++;
}
echo "There were $i files";
recrusive:
function crawl($dir){
$dir = opendir($dir);
$i = 0;
while (false !== ($file = readdir($dir)){
if (is_dir($file) and !in_array($file, array('.', '..'))){
$i += crawl($file);
}else{
$i++;
}
}
return $i;
}
$i = crawl('dir/');
echo "There were $i files";
可能对您有用:
http://www.php.net/manual/en/class.dir.php
http://www.php.net/manual/en/function.is-file.php
但是,我认为,没有其他好的解决方案。
这样的事情可能会起作用:
(可能需要为$ dir。$ file串联添加一些对“ /”的检查)
$files = array();
$dir = './items/2/l';
countFiles($dir, $files); // Recursive
countFiles($dir, $files, false); // Not recursive;
var_dump(count($files));
function countFiles($directory, &$fileArray, $recursive = true){
$currDir = opendir($directory);
while(($file = readdir($dir)) !== false)
{
if(is_dir($file) && $recursive){
countFiles($directory.$fileArray, $saveArray);
}
else if($file !== '.' && $file !== '..' && !is_dir($file))
{
$fileArray[] = $file;
}
}
}
除了要为您发布代码外,我还将概述您似乎已经具备基本代码的情况下应该执行的操作。
将代码放在函数中。 有两个参数($path, $recursive = FALSE)
,在代码中,将is_dir()
分开,如果为true并且递归标志为true,则将新路径(当前文件的路径)传递回函数(自参考)。
希望这可以帮助您学习,而不是复制粘贴:-)
递归:
function count_files($path) {
// (Ensure that the path contains an ending slash)
$file_count = 0;
$dir_handle = opendir($path);
if (!$dir_handle) return -1;
while ($file = readdir($dir_handle)) {
if ($file == '.' || $file == '..') continue;
if (is_dir($path . $file)){
$file_count += count_files($path . $file . DIRECTORY_SEPARATOR);
}
else {
$file_count++; // increase file count
}
}
closedir($dir_handle);
return $file_count;
}
非递归 :
$directory = ".. path/";
if (glob($directory . "*.") != false)
{
$filecount = count(glob($directory . "*."));
echo $filecount;
}
else
{
echo 0;
}
您可以使用SPL DirectoryIterator
以非递归方式(或使用递归迭代器以递归方式)执行此操作:
iterator_count(new DirectoryIterator($directory));
值得一提的是,这不仅会计算常规文件,还会计算目录,点文件和符号链接。 仅对于常规文件,您可以使用:
$directory = new DirectoryIterator($directory);
$count = 0;
foreach($directory as $file ){ $count += ($file->isFile()) ? 1 : 0;}
PHP 5.4.0还提供:
iterator_count(new CallbackFilterIterator($directory, function($current) { return $current->isFile(); }));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.