如何在groovy中退出临时文件夹?

时间:2017-06-19 11:11:39

标签: groovy

我正在寻找一种解决方案,当我的(Jenkins)Groovy脚本结束时,该解决方案将递归删除使用Files.createTempDirectory()创建的文件夹。

如果您阅读文档,createTempDirectory()不会删除文件夹,即使您尝试使用delete-on-exit,如果文件夹中包含其他文件,也会失败。

请注意,我正在寻找一种解决方案,不必在Groovy脚本的末尾添加额外的代码或添加try / catch方法。这是因为这些Groovy代码是从多个可重用部分编译而来的。

工作解决方案不需要在脚本末尾添加额外的代码,可能使用挂钩机制来注册目录删除操作。

import java.nio.file.Files
x = Files.createTempDirectory()
// <-- add some magic hook to tell to remove 'x' folder recursively on exit
// a lot of code I cannot touch

参考

3 个答案:

答案 0 :(得分:2)

下面怎么样?

def result = x.deleteDir()
assert result

答案 1 :(得分:2)

以下代码将在退出时从temp目录中递归删除所有文件和文件夹。

mydir = Files.createTempDirectory()
addShutdownHook {
    mydir.deleteDir()
}

此代码适用于正常的Groovy执行,但在基于Jenkins Grooby的管道上失败,因为:

an exception which occurred:
    in field delegate
    in field closures
    in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@782f5796
Caused: java.io.NotSerializableException: sun.nio.fs.UnixPath
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)

所以,我仍在努力解决“CPS”问题,第一次尝试失败并出现同样的错误:

@NonCPS
def mkdtemp(String s) {
    mydir = Files.createTempDirectory("cp-")
        addShutdownHook {
            mydir.deleteDir()
            println "cleaned"
        }
    mydir.toString()
}

node {
   mkdtemp('xxx')
}

答案 2 :(得分:0)

finally怎么样?

def tmp = Files.createTempDirectory()
try {
  // do something with tmp
}
finally {
  tmp.toFile().deleteDir()
}