我需要将文件从扩展名 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
标志如下我知道优先于过滤器。
我还尝试将所有这些放入路由参数中:
from("smb://myDirectory?delete=true&fileName=Report*.csv&password=xxxxxx&username=zzzz")
但是正则表达式不匹配 - 我无法理解为什么 - 而且我认为即使我能让正则表达式工作,问题也可能是相同的。文件名示例为 Report_Financial_20190201.csv
。
我现在唯一能想到的是 .choice().when()
条件,它将检查文件名和扩展名,然后将其转换或不转换并将其放入目标文件夹中...这可能会导致无限循环,并且通常看起来像是一个可怕的黑客行为。
解决该问题的建议方法是什么? 注意:由于要求限制,我无法使用临时文件夹或类似的内容。
最佳答案
事实上,这些标志可以组合起来。我只需要使用 include
选项而不是 filename
。这个答案帮助了我:
HOW: Apache Camel, Regex match files
我的端点现在看起来像这样:
from("smb://myDirectory?delete=true&include=Report.*\\.csv&password=xxxxxx&username=zzzz")
关于java - 来自 smb 的 Camel - 组合 "delete=true"并按文件名过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54477335/