在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 中順利獲取目錄中的所有文件和文件夾,包括那些隱藏的文件。在實際開發中,選擇適合的方式來處理隱藏文件,能夠讓你更好地控製文件的讀取和操作。