如何使用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);
?>
答案 0 :(得分:3)
递归:
$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
$count = 0;
while($it->next()) $count++;
答案 1 :(得分:1)
“非递归搜索”的大多数提到的方法都可以使用,但可以使用PHP的 glob 文件系统函数缩短它。 / p>
它基本上找到与模式匹配的路径名,因此可以用作:
$count = 0;
foreach (glob('path\to\dir\*.*') as $file) {
$count++;
}
点前的星号表示文件名,后面的星号表示文件扩展名。因此,它的使用可以进一步扩展到计算具有特定文件名,特定扩展名或两者的文件。
答案 2 :(得分:0)
非递归:
$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";
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";
答案 3 :(得分:0)
可能对您有用:
http://www.php.net/manual/en/class.dir.php
http://www.php.net/manual/en/function.is-file.php
但是,我认为,没有其他好的解决方案。
答案 4 :(得分:0)
这样的事可能会奏效:
(可能需要为$ dir。$ file concatenation添加一些'/'检查)
$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;
}
}
}
答案 5 :(得分:0)
与其为您发布代码,我会提供您应该做的大纲,因为您似乎已经拥有基本代码。
将代码放在一个函数中。在您的代码中有两个参数($path, $recursive = FALSE)
,将is_dir()
分开,如果这是真的并且递归标志为真,则将新路径(当前文件的路径)传递回函数(自引用) )。
希望这有助于您学习,而不是复制粘贴: - )
答案 6 :(得分:0)
<强>递归:强>
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;
}
答案 7 :(得分:0)
由Russell Dias提供
您可以使用SPL DirectoryIterator
以非递归方式(或以递归方式使用recursive iterator)方式执行此操作:
iterator_count(new DirectoryIterator($directory));
值得注意的是,这不仅会计算常规文件,还会计算目录,点文件和符号链接。对于常规文件 only ,您可以使用:
$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(); }));
答案 8 :(得分:0)
$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";