【问题标题】:file-pattern option in int-ftp:outboundgateway not work in recursive mode?int-ftp:outboundgateway 中的文件模式选项在递归模式下不起作用?
【发布时间】:2015-04-29 12:30:03
【问题描述】:

感谢关注,我在 spring 集成项目中使用 ls 命令定义了 int-ftp:outbound-gateway 适配器,我想过滤 递归 .op ftp 中的扩展文件目录,我将file-pattern 设置为*.op 螺母不起作用,我的代码是:

 <int-ftp:outbound-gateway id="gatewayLS"
                              session-factory="ftpSessionFactory"
                              request-channel="inbound"
                              command="ls"
                              filter="ftpFilter"
                              filename-pattern="*.op"
                              remote-directory=""
                              command-options="-R"
                              expression="payload"
                              reply-channel="toSplitter"/>

更新: 感谢@Gary 的帮助,我使用了filename-regex 选项而不是filename-pattern([foo]|.*\.op)(例如),它的工作。
对于过滤多个子目录,我们可以使用正则表达式([a-z]*|[a-z]*|.*\.op),它可以正常工作。

【问题讨论】:

  • 那为什么要递归呢?这只会匹配当前目录中以.op 结尾的文件。 **/*.op 之类的东西可能会起作用(尽管我不确定是否完全支持 ant 样式表达式。
  • 不,我们目前在这种情况下不支持任何样式的模式;请参阅我对算法的回答。

标签: spring ftp spring-integration


【解决方案1】:

问题可能是您的子目录未通过过滤器,因此未被搜索。如the documentation 中所述,您需要将子目录模式添加到您的过滤器...

... 但是,可以通过提供 FileListFilter 来过滤树中的文件;树中的目录也可以通过这种方式进行过滤。 FileListFilter 可以通过引用或文件名模式或文件名正则表达式属性提供。例如,filename-regex="(subDir|.*1.txt)" 将检索远程目录和子目录 subDir 中所有以 1.txt 结尾的文件。如果过滤了子目录,则不会对该子目录进行额外的遍历。

所以,如果你有子目录foo1foo2foo3 等,你可以使用

filename-regex="(foo[0-9]|.*\.txt)"

正则表达式的第一部分传递子目录,第二部分匹配以.txt结尾的文件(或目录)。

了解递归的工作原理很重要。从顶层开始...

  • 列出文件/目录
  • 过滤文件/目录
  • 迭代,如果是目录,则递归

当然,您可以提供自定义过滤器以按照您想要的方式工作(例如,不过滤目录)。

【讨论】:

  • 表达式@Gary如何设置多个目录?
  • 使用正则表达式;对于更复杂的场景,自定义FileListFilter 可能是最简单的。如果您需要正则表达式方面的帮助,请描述您的目录树。
  • 感谢@Gary,在我的情况下 ([a-z]*|[a-z]*|.*\.op) ,只有第一级有效?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-19
相关资源
最近更新 更多