douke1942 2012-11-18 12:51
浏览 26
已采纳

如何使用PHP计算文件夹中的文件?

The following code counts the number of files inside a folder.

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

However for some reason the count is off by 2. I have a folder with 13 files but this code returns count as 15. For an empty folder, this returns a count of 2.

Can someone point to me the issue with the above snippet?

  • 写回答

2条回答 默认 最新

  • duangang4940 2012-11-18 13:21
    关注

    I'm doing it with 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);
    

    For use as function :

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

    Displaying results based on GET superglobal:

    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>';   
            } 
        }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料