Groovy接收多目录参数合并文件时仅首个目录内容生效问题求解
Groovy多目录文件合并脚本修复方案
问题根因
- 合并文件创建逻辑放在了遍历目录的循环内部,每处理一个目录就生成一个新的带时间戳的合并文件,要么后生成的文件覆盖之前的,要么最终你拿到的仅为第一个目录处理后生成的文件
- 读取目录下文件时仅获取了纯文件名,没有拼接父目录路径,直接
new File(it)会从脚本当前工作路径查找文件,无法正确读取其他目录下的文件,导致写入空内容 - 未做入参合法性校验,无法处理传入路径不是有效目录的异常场景
修正后可用脚本
def mergeDirFilesToSingleFile(...dirPaths) { // 合并文件逻辑移到循环外,所有目录内容写入同一个文件 def d = new Date() def mergedFileLocation = "/script/merged_allure_report_${d.getTime()}.txt" def mergedFile = new File(mergedFileLocation) mergedFile.createNewFile() for (dirPath in dirPaths) { def dir = new File(dirPath) // 校验入参是否为合法目录 if (!dir.exists() || !dir.isDirectory()) { println "跳过无效路径:${dirPath}" continue } // 遍历目录下所有文件,拼接父目录路径确保能正确定位文件 dir.listFiles().each { file -> if (file.isFile()) { // 只合并文件,跳过子目录 mergedFile.append(file.getText()) } } } println "合并完成,文件路径:${mergedFile.absolutePath}" return mergedFile } // 调用示例,可传入任意多个目录路径 mergeDirFilesToSingleFile('/script/json_file_1/', '/script/json_file_2/')
核心优化点
- 合并文件全局唯一,所有目录的内容都写入同一个目标文件
- 子文件读取时自动拼接父目录路径,不会出现文件找不到的问题
- 增加目录合法性校验、自动跳过子目录,逻辑更健壮
- 所有局部变量明确声明作用域,避免全局变量污染
内容的提问来源于stack exchange,提问作者wodag
相关产品推荐
相关产品推荐

