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 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab
  • ¥15 求lingo代码和思路
  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应