在PHP 中,操作文件和目錄是非常常見的需求。 is_dir()和glob()是兩個非常有用的函數,它們可以幫助我們檢查目錄的存在性並查找匹配的文件。本文將介紹如何結合這兩個函數來獲取匹配特定目錄的文件,具體應用場景包括根據文件擴展名、文件名模式等進行篩選。
is_dir()函數用於檢測一個路徑是否是一個目錄。如果路徑指向的是一個目錄,則返回true ,否則返回false 。
<span><span><span class="hljs-variable">$isDirectory</span></span><span> = </span><span><span class="hljs-title function_ invoke__">is_dir</span></span><span>(</span><span><span class="hljs-string">'path/to/directory'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$isDirectory</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'這是一個目錄'</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'這不是一個目錄'</span></span><span>;
}
</span></span>
glob()函數用於查找匹配給定模式的路徑。它可以通過指定通配符來搜索文件,並返回匹配的文件路徑數組。例如, glob('*.txt')會返回所有.txt後綴的文件。
<span><span><span class="hljs-variable">$files</span></span><span> = </span><span><span class="hljs-title function_ invoke__">glob</span></span><span>(</span><span><span class="hljs-string">'path/to/directory/*.txt'</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 class="hljs-comment">// 輸出所有符合 *.txt 模式的文件路徑</span></span><span>
</span></span>
通過結合使用is_dir()和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-comment">// 首先使用 is_dir() 檢查目錄是否存在</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_dir</span></span><span>(</span><span><span class="hljs-variable">$directory</span></span><span>)) {
</span><span><span class="hljs-comment">// 如果目錄存在,則使用 glob() 查找所有 .php 文件</span></span><span>
</span><span><span class="hljs-variable">$phpFiles</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">'/*.php'</span></span><span>);
</span><span><span class="hljs-comment">// 輸出匹配的文件</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$phpFiles</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"找到以下 PHP 文件:\n"</span></span><span>;
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$phpFiles</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$file</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$file</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"沒有找到任何 .php 文件。\n"</span></span><span>;
}
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"指定的目錄不存在。\n"</span></span><span>;
}
</span></span>
<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-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_dir</span></span><span>(</span><span><span class="hljs-variable">$directory</span></span><span>)) {
</span><span><span class="hljs-variable">$testFiles</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">'/test_*'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$testFiles</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"找到以下以 'test_' 開頭的文件:\n"</span></span><span>;
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$testFiles</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$file</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$file</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"沒有找到符合條件的文件。\n"</span></span><span>;
}
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"目錄不存在。\n"</span></span><span>;
}
</span></span>
有時,我們不僅需要在指定目錄中查找文件,還希望遞歸地在其子目錄中進行查找。這時,我們可以結合is_dir() 、 glob()和遞歸函數來實現這一功能。
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">recursiveGlob</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$dir</span></span></span><span>, </span><span><span class="hljs-variable">$pattern</span></span><span>) {
</span><span><span class="hljs-comment">// 檢查目錄是否存在</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">is_dir</span></span><span>(</span><span><span class="hljs-variable">$dir</span></span><span>)) {
</span><span><span class="hljs-keyword">return</span></span><span> [];
}
</span><span><span class="hljs-variable">$files</span></span><span> = </span><span><span class="hljs-title function_ invoke__">glob</span></span><span>(</span><span><span class="hljs-variable">$dir</span></span><span> . </span><span><span class="hljs-string">'/'</span></span><span> . </span><span><span class="hljs-variable">$pattern</span></span><span>);
</span><span><span class="hljs-variable">$directories</span></span><span> = </span><span><span class="hljs-title function_ invoke__">glob</span></span><span>(</span><span><span class="hljs-variable">$dir</span></span><span> . </span><span><span class="hljs-string">'/*'</span></span><span>, GLOB_ONLYDIR);
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$directories</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$directory</span></span><span>) {
</span><span><span class="hljs-variable">$files</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_merge</span></span><span>(</span><span><span class="hljs-variable">$files</span></span><span>, </span><span><span class="hljs-title function_ invoke__">recursiveGlob</span></span><span>(</span><span><span class="hljs-variable">$directory</span></span><span>, </span><span><span class="hljs-variable">$pattern</span></span><span>)); </span><span><span class="hljs-comment">// 遞歸搜索子目錄</span></span><span>
}
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$files</span></span><span>;
}
</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">$txtFiles</span></span><span> = </span><span><span class="hljs-title function_ invoke__">recursiveGlob</span></span><span>(</span><span><span class="hljs-variable">$directory</span></span><span>, </span><span><span class="hljs-string">'*.txt'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$txtFiles</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"找到以下 .txt 文件:\n"</span></span><span>;
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$txtFiles</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$file</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$file</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"沒有找到任何 .txt 文件。\n"</span></span><span>;
}
</span></span>
結合is_dir()和glob()函數,我們可以輕鬆地查找並處理文件。在實際開發中,這兩個函數可以幫助我們有效地篩選文件並避免操作不存在的目錄。通過簡單的組合和遞歸處理,可以實現強大且靈活的文件查找功能。