【问题标题】:How to count files inside a folder using PHP?如何使用PHP计算文件夹内的文件?
【发布时间】:2012-11-06 13:48:13
【问题描述】:

以下代码计算文件夹中的文件数。

<?php
function folderlist(){
  $directoryist = array();
$startdir = './';
//get all image files with a .jpg extension.
  $ignoredDirectory[] = '.';
  $ignoredDirectory[] = '..';
   if (is_dir($startdir)){
       if ($dh = opendir($startdir)){
           while (($folder = readdir($dh)) !== false){
               if (!(array_search($folder,$ignoredDirectory) > -1)){
                 if (filetype($startdir . $folder) == "dir"){
                       $directorylist[$startdir . $folder]['name'] = $folder;
                       $directorylist[$startdir . $folder]['path'] = $startdir;
                   }
               }
           }
           closedir($dh);
       }
   }
return($directorylist);
}


$folders = folderlist();

$total_files = 0;
foreach ($folders as $folder){
    $path = $folder['path'];
    $name = $folder['name'];
    $count = iterator_count(new DirectoryIterator($path . $name));
    $total_files += $count;

    echo '<li>';
    echo '<a href="' .$path .'index.php?album=' .$name . '" class="style1">';
    echo '<strong>' . $name . '</strong>';
    echo ' (' . $count . ' files found)';
    echo '</a>';
    echo '</li>';
}
  echo "Total Files:". $total_files;
?>

但是由于某种原因,计数减少了 2。我有一个包含 13 个文件的文件夹,但此代码返回计数为 15。对于空文件夹,这返回计数 2。

有人可以指出上述 sn-p 的问题吗?

【问题讨论】:

    标签: php dir subdirectory


    【解决方案1】:

    我正在使用 DirectoryIterator 进行操作

    $files_in_directory = new DirectoryIterator($path_to_folder);
    $c = 0;
    
    foreach($files_in_directory as $file)
    {
        // We want only files
        if($file->isDot()) continue;
        if($file->isDir()) continue;
        $c++;
    }
    
    var_dump($c);
    

    用作函数:

    function folderlist($directories = array(), $extensions = array())
    {
        if(empty($directories))
            return false;
    
        $result      = array();
        $total_count = 0;
        foreach($directories as $directory)
        {
            $files_in_directory = new DirectoryIterator($directory);
            $c                  = 0;
    
            foreach($files_in_directory as $file)
            {
                // We want only files
                if($file->isDot()) continue;
                if($file->isDir()) continue;
    
                // This is for php < 5.3.6
                $file_extension = pathinfo($file->getFilename(), PATHINFO_EXTENSION);
    
                // If you have php >= 5.3.6 you can use following instead
                // $file_extension = $fileinfo->getExtension()
    
                if(in_array($file_extension, $extensions)){
                    $c++;
                    $result['directories'][$directory]['files'][$c]['name'] = $file->getFilename();
                    $result['directories'][$directory]['files'][$c]['path'] = $file->getPath();
                    $result['directories'][$directory]['count']             = $c;
                }     
            }
            $total_count += $c;    
        }
    
        $result['total_count'] = $total_count;
    
        return $result;    
    
    }
    

    基于 GET 超全局显示结果:

    if(isset($_GET['album']) && !empty($_GET['album']) && !isset($_GET['listfiles']))
        {
            // We are in directory view mode
            $album = $_GET['album'];
    
            // View all directories and their file count for specified album
            $view_directory = folderlist(array($album), array('jpeg', 'jpg', 'log'));
    
            // Loop the folders and display them with file count
            foreach ($view_directory['directories'] as $folder_name => $folder_files){
    
                $count = $folder_files['count'];
                echo '<li>';
                echo '<a href="files.php?album=' . $folder_name . '&listfiles=1" class="style1">';
                echo '<strong>' . basename($folder_name) . '</strong>';
                echo ' (' . $count . ' files found)';
                echo '</a>';
                echo '</li>';  
    
            }
    
            echo "Total Files:". $get_dir_info['total_count'];   
    
        }
        elseif(isset($_GET['album'], $_GET['listfiles']) && !empty($_GET['album']))
        {
            // We are in file view mode for folder
            $album = $_GET['album'];
    
            // View all files in directory
            $view_files = folderlist(array($album), array('jpeg', 'jpg', 'log'));   
    
            echo 'Showing folder content of: <b>'.basename($album).'</b>';
            foreach($view_files['directories'][$album]['files'] as $file)
            {     
    
                $path = $file['path'];
                $name = $file['name'];
    
                echo '<li>';
                echo '<a href="files.php?file=' . $name . '&path=' . $path . '" class="style1">';
                echo '<strong>' . $name . '</strong>';
                echo '</a>';
                echo '</li>';   
            } 
        }
    

    【讨论】:

    • 亲爱的你的代码是 gud,但我的问题没有解决我想要一个文件夹列表,每个文件夹显示文件中的计数示例文件夹 a(找到 23 个文件)文件夹 b(找到 12 个文件)
    • @user1833487 从你的文字中我假设你想要 1 个文件夹。但是您可以修改代码以在许多文件夹中使用。给我一点时间。
    • hmmm 我该如何修改这段代码请你帮我修改一下。
    • @user1833487 更新了代码,现在显示部分有两个循环。一个包含文件夹以及每个文件夹中有多少文件。以及该文件夹中文件的其他循环。
    • 亲爱的,我只想要文件夹列表示例文件夹a(找到 23 个文件),但您的代码也显示 jpg 文件,我也不想要 jpg 文件列表,我只想要文件夹列表和文件夹中的文件数
    【解决方案2】:

    此行仍在返回“。”和 '..' 变量。

    if (!(array_search($folder,$ignoredDirectory) > -1))
    

    见:http://php.net/manual/en/language.types.boolean.php

    试试

    if (!array_search($folder,$ignoredDirectory))
    

    编辑:

    也改变这个:

    $ignoredDirectory[] = '.';
    $ignoredDirectory[] = '..';
    

    $ignoredDirectory = array('.', '..');

    【讨论】:

    • 它应该是if(array_search($folder,$ignoredDirectory) === FALSE),否则它会为.返回true
    • 对不起,我前一秒编辑过,我搞错了逻辑。你在使用 === 吗?
    • 是的,我再次更改但无法再次显示相同的结果:(请帮助我
    • 你的代码解决了一点。点问题现在没有显示额外的点,但我的主要问题是文件夹文件计算磨损
    • 查看@arma 的答案。这就解决了问题。
    猜你喜欢
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多