当前位置: 首页> 最新文章列表> 如何结合 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() 函数,我们可以轻松地查找并处理文件。在实际开发中,这两个函数可以帮助我们有效地筛选文件并避免操作不存在的目录。通过简单的组合和递归处理,可以实现强大且灵活的文件查找功能。