在进行任何ftp操作之前,首先需要建立与ftp服务器的连接并进行身份验证。php提供了内置的ftp函数集来完成这些任务。
<?php $web = 'your_ftp_host.com'; // 替换为你的FTP主机名 $user = 'your_username'; // 替换为你的FTP用户名 $pass = 'your_password'; // 替换为你的FTP密码 // 建立FTP连接 $conn_id = ftp_connect($web); // 登录FTP服务器 $login_result = ftp_login($conn_id, $user, $pass); // 检查连接和登录是否成功 if ((!$conn_id) || (!$login_result)) { echo "FTP 连接或登录失败!\n"; exit; } else { echo "FTP 连接成功,已登录。\n"; } // 启用被动模式(PASV),通常推荐使用,以避免防火墙问题 ftp_pasv($conn_id, true); // 后续操作代码... // 完成操作后关闭FTP连接 ftp_close($conn_id); ?>
注意事项:
如果目标文件仅位于一个指定目录中,且不涉及子目录,可以使用 ftp_nlist 函数结合通配符来获取匹配的文件列表,然后逐一删除。
ftp_nlist(resource $ftp_stream, string $directory) 函数可以列出指定目录中的文件和目录。当 directory 参数包含通配符(如 *)时,它将返回匹配该模式的文件列表。
<?php // ... (FTP连接和登录代码,同上) ... $web = 'your_ftp_host.com'; $user = 'your_username'; $pass = 'your_password'; $conn_id = ftp_connect($web); ftp_login($conn_id, $user, $pass); ftp_pasv($conn_id, true); $target_directory = "/pdfs/archivo/"; // 目标目录 $search_pattern = "2019*"; // 匹配名称中包含"2019"的文件 // 使用通配符获取匹配的文件列表 $files_to_delete = ftp_nlist($conn_id, $target_directory . $search_pattern); if ($files_to_delete === false) { echo "获取文件列表失败或目录不存在。\n"; } elseif (empty($files_to_delete)) { echo "在目录 '{$target_directory}' 中未找到匹配 '{$search_pattern}' 的文件。\n"; } else { echo "找到以下文件准备删除:\n"; foreach ($files_to_delete as $file_path) { echo "- " . $file_path . "\n"; // 执行删除操作 if (ftp_delete($conn_id, $file_path)) { echo "成功删除文件: " . $file_path . "\n"; } else { echo "删除文件失败: " . $file_path . "\n"; } } } ftp_close($conn_id); ?>
说明:
立即学习“PHP免费学习笔记(深入)”;
当需要删除的文件可能散布在多个子目录中时,ftp_nlist 的单层匹配功能就不够了。这时需要一个递归函数来遍历所有子目录,并在每个子目录中查找并删除匹配的文件。
<?php // ... (FTP连接和登录代码,同上) ... $web = 'your_ftp_host.com'; $user = 'your_username'; $pass = 'your_password'; $conn_id = ftp_connect($web); ftp_login($conn_id, $user, $pass); ftp_pasv($conn_id, true); $base_path = 'pdfs/archivo'; // 起始搜索路径(相对路径或绝对路径) $search_pattern = '2019*'; // 要匹配的文件名模式 $files_to_delete = []; // 存储所有待删除文件的列表 /** * 递归搜索FTP目录并收集匹配模式的文件 * * @param string $current_path 当前搜索的目录路径 * @param string $pattern 要匹配的文件名模式 (例如 '2019*') * @param resource $conn_id FTP连接资源 * @param array $found_files 引用传递,用于收集找到的文件路径 */ $ftpRecursiveSearcher = function ($current_path, $pattern) use (&$ftpRecursiveSearcher, &$files_to_delete, &$conn_id) { // 确保路径以斜杠结尾,以便正确构建子目录路径 $current_path = rtrim($current_path, '/') . '/'; // 获取当前目录下的所有文件和目录 $list = ftp_nlist($conn_id, $current_path); if ($list === false) { echo "无法列出目录: {$current_path}\n"; return; } foreach ($list as $item_full_path) { // ftp_nlist 返回的路径可能不包含基础路径,需要处理 // 确保路径是相对于FTP根目录的完整路径 // 注意:ftp_nlist 返回的项可能是 'dir/file.txt' 或 'file.txt' // 需要判断其是否为目录 // 检查是否为目录 // ftp_size 对目录返回 -1,对文件返回文件大小 if (ftp_size($conn_id, $item_full_path) === -1) { // 是目录,递归进入 // 确保目录名是纯粹的目录名,而不是带有父路径的 // 例如,如果$item_full_path是'/pdfs/archivo/subdir',我们直接用它 $ftpRecursiveSearcher($item_full_path, $pattern); // 在当前子目录中查找匹配的文件 $targets_in_subdir = ftp_nlist($conn_id, $item_full_path . '/' . $pattern); if ($targets_in_subdir !== false && !empty($targets_in_subdir)) { $files_to_delete = array_merge($files_to_delete, $targets_in_subdir); } } else { // 是文件,检查是否匹配当前目录的模式 // 注意:这里需要从文件名中提取出名称部分进行匹配,或者直接使用ftp_nlist的通配符 // 实际上,更直接的方法是在每个目录下都尝试用模式匹配一次 // 因为ftp_nlist本身就支持通配符 // 在这里,我们已经通过在递归调用后使用 $item_full_path . '/' . $pattern 进行了处理 // 所以这个else分支可以被简化,或者用于额外的文件名匹配逻辑 // 如果需要匹配当前目录下的文件(非子目录) // 可以在这里添加额外的逻辑,但上面的 $targets_in_subdir 已经包含了 // 目录下的匹配文件,所以这里可以省略 } } // 额外:在当前层级目录中查找匹配的文件(非子目录) $targets_in_current_level = ftp_nlist($conn_id, $current_path . $pattern); if ($targets_in_current_level !== false && !empty($targets_in_current_level)) { $files_to_delete = array_merge($files_to_delete, $targets_in_current_level); } }; // 启动递归搜索 $ftpRecursiveSearcher($base_path, $search_pattern); // 移除重复项,因为在递归过程中可能因为不同路径匹配到同一个文件 $files_to_delete = array_unique($files_to_delete); if (empty($files_to_delete)) { echo "在路径 '{$base_path}' 及其子目录中未找到匹配 '{$search_pattern}' 的文件。\n"; } else { echo "找到以下文件准备删除:\n"; foreach ($files_to_delete as $file_path) { echo "- " . $file_path . "\n"; } echo "\n开始删除文件...\n"; // 遍历并删除所有找到的文件 array_walk($files_to_delete, function ($file) use (&$conn_id) { if (ftp_delete($conn_id, $file)) { echo "成功删除文件: " . $file . "\n"; } else { echo "删除文件失败: " . $file . "\n"; } }); } ftp_close($conn_id); ?>
说明:
立即学习“PHP免费学习笔记(深入)”;
本教程提供了两种PHP通过FTP删除文件的策略:针对单层目录的直接通配符匹配删除,以及针对多层目录的递归搜索与删除。
重要注意事项:
通过遵循这些指导原则,您可以安全有效地使用PHP管理FTP服务器上的文件。
以上就是PHP FTP操作:按名称模式递归删除文件教程的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号