如何打破常规&each;每个文件()'

时间:2014-09-03 03:43:39

标签: regex groovy

我有一个工作脚本,列出目录中的所有pdf文件。它按预期工作,但我需要的只是第一个pdf文件的文件名。然后我想打破eachFileMatch(),因为目录中可能有数千个pdf文件。

我在find之后尝试使用此Break from groovy each closure答案中的eachFileMatch().find但是没有效果Caught: groovy.lang.MissingMethodException: No signature of method: java.io.File.eachFileMatch() is applicable for argument types: (java.util.regex.Pattern) values: [.*.(?i)pdf]

        def directory="c:\\tmp"   // place 2 or more pdf files in that
                                  // directory and run the script
        def p =  ~/.*.(?i)pdf/
        new File( directory ).eachFileMatch(p) { pdf ->
                println pdf // and break
        }

有人能告诉我怎么做吗?

2 个答案:

答案 0 :(得分:7)

你不能打破这些each{}方法(异常会起作用,但那会很脏)。如果您检查eachFileMatch的代码,您会看到它已经读取整个list()并迭代它。所以这里的一个选择是只使用常规JDK方法并使用find返回第一个:

// only deal with filenames as string
println new File('/tmp').list().find{it=~/.tmp$/}

// work with `File` objects
println new File('/tmp').listFiles().find{it.isFile() && it=~/.tmp$/}

答案 1 :(得分:0)

use 
 ^.*?.(?i)pdf

这只会给出第一场比赛