PHP如何删除FTP目录及子目录下文件名含指定字符串的文件
问题排查与修复方案
原有代码核心问题
- 误用本地文件操作类:
RecursiveDirectoryIterator是操作运行代码的服务器本地文件的,无法读取FTP服务器的目录结构,你建立的FTP连接完全没有用到遍历、删除环节 - 文件名匹配逻辑错误:
reset(explode('.', $file))只会取文件名点分隔的第一段做完全匹配,无法实现「文件名包含2019」的需求,示例里的201902_QSA4_CA.pdf根本匹配不上 - 误用本地删除函数:
unlink用于删除本地文件,FTP服务器上的文件需要用ftp_delete函数走已建立的FTP连接删除
修复后可运行代码
<?php $web = 'mipage.com'; $user = 'xxxx'; $pass = 'xxxx'; // FTP根目录下要遍历的目标文件夹,按需修改 $targetRootDir = 'pdfs/archivo/'; // 建立FTP连接 $conn_id = ftp_connect($web); if (!$conn_id) { die('FTP连接失败'); } // 登录FTP $login_result = ftp_login($conn_id, $user, $pass); if (!$login_result) { die('FTP登录失败'); } // 开启FTP被动模式,大部分FTP服务器需要这个配置 ftp_pasv($conn_id, true); // 递归遍历FTP目录的自定义函数 function scanFtpDir($conn, $dir) { $files = []; // 获取当前目录下所有文件/文件夹 $items = ftp_nlist($conn, $dir); if ($items === false) { return $files; } foreach ($items as $item) { // 跳过.和..目录 if (basename($item) == '.' || basename($item) == '..') { continue; } // 判断是不是目录 if (@ftp_chdir($conn, $item)) { // 切回上级目录 ftp_chdir($conn, '..'); // 递归遍历子目录 $subFiles = scanFtpDir($conn, $item); $files = array_merge($files, $subFiles); } else { $files[] = $item; } } return $files; } // 获取目标目录下所有文件的全路径 $allFiles = scanFtpDir($conn_id, $targetRootDir); foreach ($allFiles as $ftpFilePath) { $fileName = basename($ftpFilePath); // 判断文件名是否包含2019 if (strpos($fileName, '2019') !== false) { // 删除FTP上的对应文件 if (ftp_delete($conn_id, $ftpFilePath)) { echo "已删除:{$ftpFilePath}\n"; } else { echo "删除失败:{$ftpFilePath}\n"; } } } // 关闭FTP连接 ftp_close($conn_id); ?>
注意事项
- 运行前建议先注释掉
ftp_delete部分,先打印匹配到的文件确认没问题再执行删除,避免误删 - 如果FTP服务器是主动模式,去掉
ftp_pasv($conn_id, true)这行即可 - 确保FTP账号对目标目录有删除权限
内容的提问来源于stack exchange,提问作者alfredo49
相关产品推荐
相关产品推荐

