在给定的时间间隔后删除子文件夹

时间:2011-06-21 13:11:03

标签: java groovy

在一段时间间隔(月)之后,我想删除包含内容的子文件夹。有人可以帮助我实现这一目标。以下代码显示了与Iterator相关的错误。

// Create a ref for closure
def dir
def yesterday = ( new Date() ).time - 1000*60*60*24    

//definition Closure    
dir = {
  while(it.hasNext()){
    it.eachDirRecurse( dir )
      println("Dir: " + it.canonicalPath)
    if(it.lastModified() <= yesterday)  
      it.deleteDir()
  }
}

// Apply closure
dir( new File("H:\\soapUI\\Adres\\") )

这是例外:

Caught: groovy.lang.MissingMethodException: No signature of method: java.io.File.hasNext() is applicable for argument types: () values: []
  Possible solutions: inspect(), getText(), getText(java.lang.String), setText(java.lang.String), setText(java.lang.String, java.lang.String), hashCode()\
at test$_run_closure1.doCall(test.groovy:8)
    at test.run(test.groovy:19)

3 个答案:

答案 0 :(得分:2)

您的代码中至少有几个错误......

  • 为什么要对文件<{li>进行it.hasNext()
  • 你打电话给it.eachDirRecurse,它将递归整个树,但你再为该树中的每个目录再次调用它......

你也会遇到问题,因为你会删除一个目录,但是eachDirRecurse仍然会尝试走进那个目录并抛出一个FileNotFoundException

我认为你不得不使用eachDirRecurse

假设你使用的是Groovy 1.8(你没说),你可以这样做:

import groovy.time.TimeCategory
import static groovy.io.FileType.*

def yesterday = use( TimeCategory ) { new Date() - 1.day }

def deleteFoldersIn = { File f ->
  f.traverse( [ type:DIRECTORIES, postDir:{ d -> if( d.lastModified() < yesterday.time ) d.deleteDir() } ] ) { 
    println "Scanning $it"
  }
}

// Apply closure
deleteFoldersIn( new File( 'H:\\soapUI\\Adres\\' ) )

以下是TimeCategoryFileTypeFile.traverse()

的文档

答案 1 :(得分:0)

new File('dir')。deleteVir()在groovy 1.8中递归给我

饮料中有魔力!

答案 2 :(得分:0)

否则您可以使用dir和deleteDir功能。

DeleteDir:递归删除当前目录及其内容。将不会遵循符号链接和联结,但将被删除。要删除工作空间的特定目录,请在dir步骤中包装deleteDir步骤。

dir('directoryToDelete') {
    deleteDir()
}