當前位置: 首頁> 最新文章列表> 如何結合is_dir() 和glob() 函數來獲取匹配特定目錄的文件?

如何結合is_dir() 和glob() 函數來獲取匹配特定目錄的文件?

M66 2025-07-04

如何結合is_dir()glob()函數來獲取匹配特定目錄的文件?

在PHP 中,操作文件和目錄是非常常見的需求。 is_dir()glob()是兩個非常有用的函數,它們可以幫助我們檢查目錄的存在性並查找匹配的文件。本文將介紹如何結合這兩個函數來獲取匹配特定目錄的文件,具體應用場景包括根據文件擴展名、文件名模式等進行篩選。

1. is_dir()函數簡介

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>

2. glob()函數簡介

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>

3. 結合is_dir()glob()函數

通過結合使用is_dir()glob() ,我們可以實現在指定目錄中查找匹配特定模式的文件,並且僅當該目錄存在時才進行搜索。這樣能避免在目錄不存在時進行無意義的文件搜索。

示例:查找特定目錄下所有.php文件

<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>

示例:查找特定目錄下所有以test_開頭的文件

<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>

4. 結合遞歸查找目錄中的文件

有時,我們不僅需要在指定目錄中查找文件,還希望遞歸地在其子目錄中進行查找。這時,我們可以結合is_dir()glob()和遞歸函數來實現這一功能。

示例:遞歸查找所有.txt文件

<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>

5. 總結

結合is_dir()glob()函數,我們可以輕鬆地查找並處理文件。在實際開發中,這兩個函數可以幫助我們有效地篩選文件並避免操作不存在的目錄。通過簡單的組合和遞歸處理,可以實現強大且靈活的文件查找功能。