【问题标题】:PHP: How to list files in a directory without listing subdirectoriesPHP:如何列出目录中的文件而不列出子目录
【发布时间】:2011-10-07 08:43:02
【问题描述】:

这是我列出目录中文件的代码的开始部分:

$files = scandir($dir); 
$array = array(); 
foreach($files as $file)
{
    if($file != '.' && $file != '..' && !is_dir($file)){
          ....

我正在尝试列出目录中的所有文件而不列出子文件夹。该代码正在运行,但同时显示文件和文件夹。正如您在上面的代码中看到的那样,我添加了!is_dir($file),但结果仍然相同。

【问题讨论】:

    标签: php file list


    【解决方案1】:

    我觉得应该是这样的:

    $files = scandir($dir); 
    foreach($files as $file)
    {
        if(is_file($dir.$file)){
          ....
    

    【讨论】:

    • 自'.'和 '..' 是目录,“$file != '.' && $file != '..' &&" 在表达式中是多余的。后面的 dir 分隔符没有区别。
    【解决方案2】:

    只需使用is_file

    例子:

    foreach($files as $file)
    {
        if( is_file($file) )
        {
           // Something
        }
    }
    

    【讨论】:

    • 我可以,但是对于我的具体示例,我想知道为什么 is_dir() 不起作用。谢谢+1
    【解决方案3】:

    这将扫描文件,然后检查 .或 .. 在数组中。然后推送不包括 .和 .. 在新的 files[] 数组中。

    试试这个:

    $scannedFiles = scandir($fullPath);
    $files = [];
    
    foreach ($scannedFiles as $file) {
        if (!in_array(trim($file), ['.', '..'])) {
            $files[] = $file;
        }
    }
    

    【讨论】:

    • 您好,欢迎来到 *。请在代码中添加一些解释。
    【解决方案4】:

    对于这么简单的事情来说是多么痛苦!没有什么对我有用... 为了得到结果,我假设文件名有一个扩展名,在我的情况下它必须。

    if ($handle = opendir($opendir)) {
        while (false !== ($entry = readdir($handle))) {
            $pos = strpos( $entry, '.' );
            if ($entry != "." && $entry != ".." && is_numeric($pos)  ) {
    

    ............很好的入口

    【讨论】:

    • 好吧,您已经指出了这一点,但仍然有每天的文件名称中没有点。
    【解决方案5】:

    这是一种仅列出文件的快速简单的单行器。由于用户只想列出文件,因此无需扫描目录并返回所有内容并排除目录。只需获取任何类型或特定类型的文件。使用 * 返回所有文件,无论扩展名如何,或通过将 * 替换为扩展名来获取具有特定扩展名的文件。

    获取所有文件,无论扩展名如何:

    $files = glob($dir . DIRECTORY_SEPARATOR . "*");
    

    获取所有带有 php 扩展名的文件:

    $files = glob($dir . DIRECTORY_SEPARATOR . "*.php");
    

    获取所有带有js扩展名的文件:

    $files = glob($dir . DIRECTORY_SEPARATOR . "*.js");
    

    我的网站使用以下内容:

    function fileList(string $directory, string $extension="") :array
    {
        $filetype = '*';
        if(!empty($extension) && mb_substr($extension, 0, 1, "UTF-8") != '.'):
            $filetype .= '.' . $extension;
        else:
            $filetype .= $extension;
        endif;
        return glob($directory . DIRECTORY_SEPARATOR . $filetype);
    }
    

    用法:

    $files = fileList($configData->includesDirectory, '');
    

    使用我的自定义函数,我可以包含扩展名或将其留空。此外,我可能会忘记放置 .在扩展之前,它会成功。

    【讨论】:

      【解决方案6】:

      使用DIRECTORY_SEPARATOR 常量也可以将文件附加到其目录路径。

          function getFileNames($directoryPath) {
              $fileNames = [];
              $contents = scandir($directoryPath);
      
              foreach($contents as $content) {
                  if(is_file($directoryPath . DIRECTORY_SEPARATOR . $content)) {
                      array_push($fileNames, $content);
                  }
              }
      
              return $fileNames;
          }
      

      【讨论】: