【问题标题】:Getting the names of all files in a directory with PHP使用 PHP 获取目录中所有文件的名称
【发布时间】:2011-02-24 18:17:53
【问题描述】:

出于某种原因,我不断收到使用此代码的文件名的“1”:

if (is_dir($log_directory))
{
    if ($handle = opendir($log_directory))
    {
        while($file = readdir($handle) !== FALSE)
        {
            $results_array[] = $file;
        }
        closedir($handle);
    }
}

当我回显 $results_array 中的每个元素时,我得到一堆 '1',而不是文件名。如何获取文件名?

【问题讨论】:

标签: php file directory filenames


【解决方案1】:

只需使用glob('*')。这里是Documentation

【讨论】:

    【解决方案2】:

    不要打扰 open/readdir 而是使用 glob

    foreach(glob($log_directory.'/*.*') as $file) {
        ...
    }
    

    【讨论】:

    • 由于问题要求提供文件,因此您可能需要在该 glob 周围加上 array_filter(..., 'is_file')
    • 并非所有文件名都采用*.* 形式:只需改用*
    • 我们如何获取扩展名列表中的所有文件?例如。如果我们想要所有 .php 和 .js 文件?
    • 是的,这个答案不是很可靠。文件不需要扩展名,目录可以命名为something.something。最好使用array_filterglob($log_directory.'/*')
    • 我对此表示赞同,因为我只需要简单的答案,我的用例的所有相关文件都是*.*。更健壮的表达式将使这成为更好的答案。
    【解决方案3】:

    这是由于操作员的偏好。尝试将其更改为:

    while(($file = readdir($handle)) !== FALSE)
    {
        $results_array[] = $file;
    }
    closedir($handle);
    

    【讨论】:

      【解决方案4】:

      您需要用括号将$file = readdir($handle) 括起来。

      给你:

      $log_directory = 'your_dir_name_here';
      
      $results_array = array();
      
      if (is_dir($log_directory))
      {
              if ($handle = opendir($log_directory))
              {
                      //Notice the parentheses I added:
                      while(($file = readdir($handle)) !== FALSE)
                      {
                              $results_array[] = $file;
                      }
                      closedir($handle);
              }
      }
      
      //Output findings
      foreach($results_array as $value)
      {
          echo $value . '<br />';
      }
      

      【讨论】:

        【解决方案5】:

        我有更小的代码来做这个:

        $path = "Pending2Post/";
        $files = scandir($path);
        foreach ($files as &$value) {
            echo "<a href='http://localhost/".$value."' target='_blank' >".$value."</a><br/><br/>";
        }
        

        【讨论】:

        • 返回所有文件,但两个名为“。”的垃圾文件除外。和 ”..”。我没有任何名为“。”的文件。和“..”在我的目录中。
        • 使用 $files = array_diff(scandir($path), array('.', '..'));释放我讨论过的上述错误。
        • 不错。如何删除文件的扩展名? (我需要删除每个文件上的.php。)
        • 这是最有说服力的解决方案,至少对于我想要的用法而言。
        【解决方案6】:

        SPL风格:

        foreach (new DirectoryIterator(__DIR__) as $file) {
          if ($file->isFile()) {
              print $file->getFilename() . "\n";
          }
        }
        

        查看DirectoryIteratorSplFileInfo 类以获取您可以使用的可用方法列表。

        【讨论】:

        【解决方案7】:

        glob()FilesystemIterator 示例:

        /* 
         * glob() examples
         */
        
        // get the array of full paths
        $result = glob( 'path/*' );
        
        // get the array of file names
        $result = array_map( function( $item ) {
            return basename( $item );
        }, glob( 'path/*' ) );
        
        
        /* 
         * FilesystemIterator examples
         */
        
        // get the array of file names by using FilesystemIterator and array_map()
        $result = array_map( function( $item ) {
            // $item: SplFileInfo object
            return $item->getFilename();
        }, iterator_to_array( new FilesystemIterator( 'path' ), false ) );
        
        // get the array of file names by using FilesystemIterator and iterator_apply() filter
        $it = new FilesystemIterator( 'path' );
        iterator_apply( 
            $it, 
            function( $item, &$result ) {
                // $item: FilesystemIterator object that points to current element
                $result[] = (string) $item;
                // The function must return TRUE in order to continue iterating
                return true;
            }, 
            array( $it, &$result )
        );
        

        【讨论】:

          【解决方案8】:

          在某些操作系统上,您会看到 . ...DS_Store,我们不能使用它们,所以让我们隐藏它们。

          首先开始获取有关文件的所有信息,使用scandir()

          // Folder where you want to get all files names from
          $dir = "uploads/";
          
          /* Hide this */
          $hideName = array('.','..','.DS_Store');    
          
          // Sort in ascending order - this is default
          $files = scandir($dir);
          /* While this to there no more files are */
          foreach($files as $filename) {
              if(!in_array($filename, $hideName)){
                 /* echo the name of the files */
                 echo "$filename<br>";
              }
          }
          

          【讨论】:

            【解决方案9】:

            由于已接受的答案有两个重要的不足,我将改进的答案发布给那些正在寻找正确答案的新人:

            foreach (array_filter(glob('/Path/To/*'), 'is_file') as $file)
            {
                // Do something with $file
            }
            
            1. 使用is_file 过滤globe 函数结果是必要的,因为它也可能返回一些目录。
            2. 并非所有文件的名称中都包含.,因此*/* 模式通常很糟糕。

            【讨论】:

            • 这是一个对我有用的干净执行。以前的答案在结果中显示了我不想要的目录。
            • 您先生需要更多的支持!实际上(在 Windows 上)我不得不使用 basename($file) 来仅获取文件名而不是带有文件名的整个路径。
            【解决方案10】:

            你可以试试scandir(Path) 函数。实现起来又快又容易

            语法:

            $files = scandir("somePath");
            

            此函数将文件列表返回到数组中。

            查看结果,可以试试

            var_dump($files);
            

            或者

            foreach($files as $file)
            { 
            echo $file."< br>";
            } 
            

            【讨论】:

              【解决方案11】:

              另一种列出目录和文件的方法是使用RecursiveTreeIterator 此处回答:https://stackoverflow.com/a/37548504/2032235

              可以在这里找到RecursiveIteratorIterator 和 PHP 中的迭代器的详尽解释:https://stackoverflow.com/a/12236744/2032235

              【讨论】:

                【解决方案12】:

                我只是使用这个代码:

                <?php
                    $directory = "Images";
                    echo "<div id='images'><p>$directory ...<p>";
                    $Files = glob("Images/S*.jpg");
                    foreach ($Files as $file) {
                        echo "$file<br>";
                    }
                    echo "</div>";
                ?>
                

                【讨论】:

                  【解决方案13】:

                  用途:

                  if ($handle = opendir("C:\wamp\www\yoursite/download/")) {
                  
                      while (false !== ($entry = readdir($handle))) {
                          if ($entry != "." && $entry != "..") {
                              echo "<b>" . preg_replace('/\\.[^.\\s]{3,4}$/', '', $entry) . "</b>";
                          }
                      }
                      closedir($handle);
                  }
                  

                  来源:http://chandreshrana.blogspot.com/2016/08/how-to-fetch-all-files-name-from-folder.html

                  【讨论】:

                    【解决方案14】:

                    递归代码探索目录中包含的所有文件('$path'包含目录的路径):

                    function explore_directory($path)
                    {
                        $scans = scandir($path);
                    
                        foreach($scans as $scan)
                        {
                            $new_path = $path.$scan;
                    
                            if(is_dir($new_path))
                            {
                                $new_path = $new_path."/";
                                explore_directory($new_path);
                            }
                            else // A file
                            {
                                /*
                                      Body of code
                                */
                            }
                        }
                    }
                    

                    【讨论】:

                      【解决方案15】:

                      我为此创建了一些小东西:

                      function getFiles($path) {
                          if (is_dir($path)) {
                              $res = array();
                              foreach (array_filter(glob($path ."*"), 'is_file') as $file) {
                                  array_push($res, str_replace($path, "", $file));                
                              }
                              return $res;
                          }
                          return false;
                      }
                      

                      【讨论】:

                        猜你喜欢
                        • 2014-05-20
                        • 2012-01-10
                        • 1970-01-01
                        • 1970-01-01
                        • 2015-01-31
                        • 2013-07-23
                        • 2013-04-29
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多