为了实现遍历文件夹的功能,可以使用PHP提供的目录迭代器(DirectoryIterator)、文件迭代器(FilesystemIterator)和递归函数等方式。
目录迭代器(DirectoryIterator)
DirectoryIterator 的基本使用
DirectoryIterator 可以基于指定的目录路径或文件夹资源句柄来创建,然后通过对其进行循环,可以访问目录中的所有文件和子目录,代码如下:
$dir_path = "/path/to/dir"; // 目标文件夹路径
try {
foreach(new DirectoryIterator($dir_path) as $file) {
if($file->isDot()) continue; // 跳过'.'和'..'
if($file->isFile()) {
echo "File: " . $file . "\n";
} elseif($file->isDir()) {
echo "Directory: " . $file . "\n";
// 遍历子目录
foreach(new DirectoryIterator($file->getPathname()) as $sub_file) {
if($sub_file->isDot()) continue; // 跳过'.'和'..'
if($sub_file->isFile()) {
echo " Sub File: " . $sub_file . "\n";
} elseif($sub_file->isDir()) {
echo " Sub Directory: " . $sub_file . "\n";
}
}
}
}
} catch (Exception $e) {
echo $e->getMessage();
}
DirectoryIterator 示例1:输出指定目录下所有文件的文件名
$dir_path = "/path/to/dir"; // 目标文件夹路径
try {
foreach(new DirectoryIterator($dir_path) as $file) {
if($file->isDot()) continue; // 跳过'.'和'..'
if($file->isFile()) {
echo $file->getFilename() . "\n";
}
}
} catch (Exception $e) {
echo $e->getMessage();
}
DirectoryIterator 示例2:删除指定目录下所有文件(包括子目录中的文件)
function delete_all_files($dir_path) {
try {
$iterator = new DirectoryIterator($dir_path);
foreach ($iterator as $file) {
if ($file->isDot()) continue;
if ($file->isFile()) unlink($file->getPathname());
if ($file->isDir()) delete_all_files($file->getPathname());
}
rmdir($dir_path);
} catch (Exception $e) {
echo $e->getMessage();
}
}
$dir_path = "/path/to/dir"; // 目标文件夹路径
delete_all_files($dir_path);
文件迭代器(FilesystemIterator)
FilesystemIterator 的基本使用
FilesystemIterator 遍历指定路径下的所有文件和子目录,能够以很多不同的方式排序和过滤文件列表。代码示例如下:
$dir_path = "/path/to/dir"; // 目标文件夹路径
try {
$iterator = new \FilesystemIterator($dir_path);
foreach ($iterator as $file) {
if ($file->isFile()) {
echo "File: " . $file . "\n";
} elseif ($file->isDir()) {
echo "Directory: " . $file . "\n";
// 遍历子目录
$sub_iterator = new \FilesystemIterator($file->getPathname());
foreach ($sub_iterator as $sub_file) {
if ($sub_file->isFile()) {
echo " Sub File: " . $sub_file . "\n";
} elseif ($sub_file->isDir()) {
echo " Sub Directory: " . $sub_file . "\n";
}
}
}
}
} catch (\Exception $e) {
echo $e->getMessage();
}
FilesystemIterator 示例1:输出指定目录下所有文件的文件名
$dir_path = "/path/to/dir"; // 目标文件夹路径
try {
$iterator = new \FilesystemIterator($dir_path);
foreach ($iterator as $file) {
if($file->isFile()) {
echo $file->getFilename() . "\n";
}
}
} catch (\Exception $e) {
echo $e->getMessage();
}
FilesystemIterator 示例2:删除指定目录下所有文件(包括子目录中的文件)
function delete_all_files($dir_path) {
try {
$iterator = new \FilesystemIterator($dir_path);
foreach ($iterator as $file) {
if($file->isDir()) {
delete_all_files($file->getPathname());
rmdir($file->getPathname());
}
if ($file->isFile()) unlink($file->getPathname());
}
rmdir($dir_path);
} catch (\Exception $e) {
echo $e->getMessage();
}
}
$dir_path = "/path/to/dir"; // 目标文件夹路径
delete_all_files($dir_path);
递归函数方式
递归方式遍历指定目录
递归遍历目录是常用的遍历方式,相比于目录或文件迭代器来说,递归方式并不需要一次性地将整个目录中的所有文件和子目录都放入内存中。递归遍历的代码示例如下:
function traverse_dir($dir_path) {
if(!is_dir($dir_path)) {
return;
}
$handle = opendir($dir_path);
while(($file = readdir($handle)) !== false) {
if($file !== '.' && $file !== '..') {
$file_path = $dir_path . DIRECTORY_SEPARATOR . $file;
if(is_file($file_path)) {
echo "File: " . $file_path . "\n";
} elseif(is_dir($file_path)) {
echo "Directory: " . $file_path . "\n";
// 遍历子目录
traverse_dir($file_path);
}
}
}
closedir($handle);
}
递归方式遍历指定目录的示例1:输出指定目录下所有文件的文件名
function traverse_dir($dir_path) {
if(!is_dir($dir_path)) {
return;
}
$handle = opendir($dir_path);
while(($file = readdir($handle)) !== false) {
if($file !== '.' && $file !== '..') {
$file_path = $dir_path . DIRECTORY_SEPARATOR . $file;
if(is_file($file_path)) {
echo $file_path . "\n";
} elseif(is_dir($file_path)) {
traverse_dir($file_path);
}
}
}
closedir($handle);
}
$dir_path = "/path/to/dir"; // 目标文件夹路径
traverse_dir($dir_path);
递归方式遍历指定目录的示例2:删除指定目录下所有文件(包括子目录中的文件)
function delete_all_files($dir_path) {
if(!is_dir($dir_path)) {
return;
}
$handle = opendir($dir_path);
while(($file = readdir($handle)) !== false) {
if($file !== '.' && $file !== '..') {
$file_path = $dir_path . DIRECTORY_SEPARATOR . $file;
if(is_file($file_path)) {
unlink($file_path);
} elseif(is_dir($file_path)) {
delete_all_files($file_path);
rmdir($file_path);
}
}
}
closedir($handle);
rmdir($dir_path);
}
$dir_path = "/path/to/dir"; // 目标文件夹路径
delete_all_files($dir_path);
以上就是常见的PHP实现遍历文件夹的几种方式。在实际的开发过程中,可以根据实际情况选择合适的遍历方式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php实现遍历文件夹的方法汇总 - Python技术站