我在groovy中编写了一个脚本,在具有某些名称的给定目录中递归地查找文件java测试文件,代码的相关部分是:
def projectRootDirectory = args.length ? new File(args[0]) : new File(System.getProperty("user.dir"))
def srcFilesCount = 0, testFilesCount = 0, srcLinesCount=0, testLinesCount=0
def srcFileSubstringPattern = '.java'
def testFileSubstringPattern = 'Test.java'
projectRootDirectory.eachDirRecurse() { dir ->
dir.eachFile {
if (it.name.endsWith(testFileSubstringPattern) || it.name ==~ /Test.*java/ ||
it.name.endsWith('Tests.java') || it.name.endsWith('TestCase.java')) {
//println "Test file found: " + it.name
testFilesCount++
it.eachLine { testLinesCount++ }
} else if (it.name.contains(srcFileSubstringPattern)) {
srcFilesCount++
it.eachLine { srcLinesCount++ }
}
}
}
它找到了使用SVN克隆的repo中已存在的文件,例如someTestCase.java
,但是当我在Windows 7中通过Cygwin使用命令touch dummyTestCase.java
创建一些新文件时,或者通过Windows 7资源管理器right click -> New -> Text Document
选项并将其重命名为TestDummy.java
,但它找不到它们。该脚本还以相同的方式处理相应文件的副本,即它找到已存在的旧文件的副本,但不查找我创建的新文件的副本。我甚至在新创建的文件上打开了文件权限,但没有任何变化。而通过Cygwin的BASH find
命令总是找到所有文件没有任何问题。我已确认使用诊断打印语句,脚本正在查找正确的目录。我甚至通过让脚本在那里创建一些文件并确认它们是在正确的位置创建来确认这一点。
答案 0 :(得分:1)
eachDirRecurse
替换了eachFileRecurse
,因此也消除了嵌套循环。非常感谢所有评论作者,他们的帮助促使我发现了这一点。