在 PHP 中,scandir 函数是非常常用的一个函数,用来列出目录中的所有文件和文件夹。默认情况下,它不会列出隐藏文件(以点号 . 开头的文件或文件夹)。这可能在某些情况下给我们带来不便,比如当我们需要列出一个目录中的所有内容(包括隐藏文件)时,如何做到这一点呢?本文将一步一步带你了解如何使用 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。
如果我们运行以下代码:
<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>] => .
[</span><span><span class="hljs-meta">1</span></span><span>] => ..
[</span><span><span class="hljs-meta">2</span></span><span>] => file1.txt
[</span><span><span class="hljs-meta">3</span></span><span>] => folder1
[</span><span><span class="hljs-meta">4</span></span><span>] => file2.txt
)
</span></span>
可以看到,目录中的隐藏文件(例如 .env 文件)并没有被列出,而只有当前目录 . 和父目录 .. 被列出。
要让 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> && </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 来过滤掉以 . 开头的文件(即隐藏文件),并确保不包括 . 和 .. 目录。
另一个常见的做法是结合使用 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 返回的结果合并。
如果你想对列出的隐藏文件进行更多操作,比如排除某些文件,或者对文件进行排序,可以对 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>
通过上述两种方法,你可以灵活地使用 scandir 函数列出隐藏文件,无论是使用自定义过滤方法,还是结合 glob 函数,都能帮助你在 PHP 中顺利获取目录中的所有文件和文件夹,包括那些隐藏的文件。在实际开发中,选择适合的方式来处理隐藏文件,能够让你更好地控制文件的读取和操作。