当前位置: 首页> 最新文章列表> 如何使用 scandir 函数也能列出隐藏文件?一步步教你实现方法

如何使用 scandir 函数也能列出隐藏文件?一步步教你实现方法

gitbox 2025-09-02

在 PHP 中,scandir 函数是非常常用的一个函数,用来列出目录中的所有文件和文件夹。默认情况下,它不会列出隐藏文件(以点号 . 开头的文件或文件夹)。这可能在某些情况下给我们带来不便,比如当我们需要列出一个目录中的所有内容(包括隐藏文件)时,如何做到这一点呢?本文将一步一步带你了解如何使用 scandir 函数来列出隐藏文件。

1. scandir 函数简介

scandir 函数的基本语法如下:

<span><span><span class="hljs-variable">$files</span></span><span> = </span><span><span class="hljs-title function_ invoke__">scandir</span></span><span>(</span><span><span class="hljs-variable">$directory</span></span><span>, </span><span><span class="hljs-variable">$sorting_order</span></span><span>);
</span></span>
  • $directory:指定需要列出文件的目录路径。

  • $sorting_order:可选,指定排序方式,默认是升序排序。

该函数返回的是一个包含目录中文件和文件夹名称的数组。如果没有访问权限或目录不存在,则返回 false

2. 默认情况下,scandir 不列出隐藏文件

如果我们运行以下代码:

<span><span><span class="hljs-variable">$files</span></span><span> = </span><span><span class="hljs-title function_ invoke__">scandir</span></span><span>(</span><span><span class="hljs-string">'/path/to/directory'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$files</span></span><span>);
</span></span>

结果可能是类似以下内容的输出:

<span><span>Array
(
    [</span><span><span class="hljs-meta">0</span></span><span>] =&gt; .
    [</span><span><span class="hljs-meta">1</span></span><span>] =&gt; ..
    [</span><span><span class="hljs-meta">2</span></span><span>] =&gt; file1.txt
    [</span><span><span class="hljs-meta">3</span></span><span>] =&gt; folder1
    [</span><span><span class="hljs-meta">4</span></span><span>] =&gt; file2.txt
)
</span></span>

可以看到,目录中的隐藏文件(例如 .env 文件)并没有被列出,而只有当前目录 . 和父目录 .. 被列出。

3. 如何列出隐藏文件?

要让 scandir 也列出隐藏文件,我们可以通过两种方式来实现:一种是使用自定义过滤方法,另一种是通过组合 scandir 返回的数组进行过滤。

方法一:自定义过滤

我们可以自定义一个过滤器,手动检查 scandir 返回的文件名是否以 . 开头,然后根据需求决定是否要保留它们。

<span><span><span class="hljs-variable">$directory</span></span><span> = </span><span><span class="hljs-string">'/path/to/directory'</span></span><span>;
</span><span><span class="hljs-variable">$files</span></span><span> = </span><span><span class="hljs-title function_ invoke__">scandir</span></span><span>(</span><span><span class="hljs-variable">$directory</span></span><span>);

</span><span><span class="hljs-comment">// 使用 array_filter 过滤出隐藏文件</span></span><span>
</span><span><span class="hljs-variable">$allFiles</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_filter</span></span><span>(</span><span><span class="hljs-variable">$files</span></span><span>, function(</span><span><span class="hljs-variable">$file</span></span><span>) {
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$file</span></span><span>[</span><span><span class="hljs-number">0</span></span><span>] === </span><span><span class="hljs-string">'.'</span></span><span> || </span><span><span class="hljs-variable">$file</span></span><span> !== </span><span><span class="hljs-string">'.'</span></span><span> &amp;&amp; </span><span><span class="hljs-variable">$file</span></span><span> !== </span><span><span class="hljs-string">'..'</span></span><span>;
});

</span><span><span class="hljs-comment">// 输出所有文件和文件夹(包括隐藏文件)</span></span><span>
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$allFiles</span></span><span>);
</span></span>

在这个例子中,我们使用了 array_filter 来过滤掉以 . 开头的文件(即隐藏文件),并确保不包括 ... 目录。

方法二:结合 scandir 返回结果与 glob 函数

另一个常见的做法是结合使用 glob 函数,这个函数允许我们通过模式匹配列出特定类型的文件,包括隐藏文件。

<span><span><span class="hljs-variable">$directory</span></span><span> = </span><span><span class="hljs-string">'/path/to/directory'</span></span><span>;
</span><span><span class="hljs-variable">$allFiles</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_merge</span></span><span>(</span><span><span class="hljs-title function_ invoke__">scandir</span></span><span>(</span><span><span class="hljs-variable">$directory</span></span><span>), </span><span><span class="hljs-title function_ invoke__">glob</span></span><span>(</span><span><span class="hljs-variable">$directory</span></span><span> . </span><span><span class="hljs-string">'/.*'</span></span><span>));

</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$allFiles</span></span><span>);
</span></span>

通过这种方式,glob 会列出所有符合模式的隐藏文件(即以 . 开头的文件),并与 scandir 返回的结果合并。

4. 过滤并处理返回的文件

如果你想对列出的隐藏文件进行更多操作,比如排除某些文件,或者对文件进行排序,可以对 scandir 返回的数组进行处理。

例如,排除所有以 .git 开头的隐藏文件:

<span><span><span class="hljs-variable">$directory</span></span><span> = </span><span><span class="hljs-string">'/path/to/directory'</span></span><span>;
</span><span><span class="hljs-variable">$files</span></span><span> = </span><span><span class="hljs-title function_ invoke__">scandir</span></span><span>(</span><span><span class="hljs-variable">$directory</span></span><span>);

</span><span><span class="hljs-variable">$filteredFiles</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_filter</span></span><span>(</span><span><span class="hljs-variable">$files</span></span><span>, function(</span><span><span class="hljs-variable">$file</span></span><span>) {
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$file</span></span><span>[</span><span><span class="hljs-number">0</span></span><span>] !== </span><span><span class="hljs-string">'.'</span></span><span> || </span><span><span class="hljs-title function_ invoke__">strpos</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-string">'.git'</span></span><span>) !== </span><span><span class="hljs-number">0</span></span><span>;
});

</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$filteredFiles</span></span><span>);
</span></span>

5. 总结

通过上述两种方法,你可以灵活地使用 scandir 函数列出隐藏文件,无论是使用自定义过滤方法,还是结合 glob 函数,都能帮助你在 PHP 中顺利获取目录中的所有文件和文件夹,包括那些隐藏的文件。在实际开发中,选择适合的方式来处理隐藏文件,能够让你更好地控制文件的读取和操作。