當前位置: 首頁> 最新文章列表> 如何使用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 中順利獲取目錄中的所有文件和文件夾,包括那些隱藏的文件。在實際開發中,選擇適合的方式來處理隱藏文件,能夠讓你更好地控製文件的讀取和操作。