我需要将文件扩展名A转换为仅与特定文件名匹配的文件B,具有原始扩展名的文件应在处理时删除。但是,不应删除目录中的其他文件。我正在使用Apache Camel 2.17.2(不幸的是无法升级到较新版本)。
我尝试将delete=true
标志与文件过滤器组合在一起,但是即使过滤器可以工作,它也会删除所有文件。
from("smb://myDirectory?delete=true&password=xxxxxx&username=zzzz").
.filter(PredicateBuilder.and(header(Exchange.FILE_NAME).startsWith("Report"), PredicateBuilder.not(header(Exchange.FILE_NAME).endsWith("zip"))))
此解决方案首先将原始文件转换为我想要的格式,而不是按预期方式再次转换转换后的文件,但是由于delete=true
标志,它也删除了转换后的文件,据我所知优先于过滤器。
我也尝试过将所有这些都放入route参数:
from("smb://myDirectory?delete=true&fileName=Report*.csv&password=xxxxxx&username=zzzz")
但是然后正则表达式不匹配-我不明白为什么-而且我认为即使我可以使正则表达式工作,问题也可能相同。文件名示例为Report_Financial_20190201.csv
。
我现在唯一想到的是一个.choice().when()
条件,该条件将检查文件名和扩展名并将其转换与否并将其放入目标文件夹中……这可能会导致无限循环通常看起来像是一个可怕的骇客。
建议的解决方法是什么? 注意:由于需求限制,我无法使用临时文件夹或类似的文件。
答案 0 :(得分:1)
实际上,这些标志可以组合。我只需要使用include
选项而不是filename
。这个答案帮助我:
HOW: Apache Camel, Regex match files
我的端点现在看起来像这样:
from("smb://myDirectory?delete=true&include=Report.*\\.csv&password=xxxxxx&username=zzzz")