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

在groovy中如何在退出时删除临时文件夹?,groovy,Groovy,我正在寻找一种解决方案,当我的(Jenkins)Groovy脚本结束时,该解决方案将递归删除使用Files.createTempDirectory()创建的文件夹 如果您阅读了文档createTempDirectory()并没有删除文件夹,并且即使您尝试在退出时使用delete-on-exit,如果文件夹中有其他文件,它也会失败 请注意,我正在寻找一种不必在Groovy脚本末尾添加额外代码或添加try/catch方法的解决方案。这是因为这些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
导入java.nio.file.Files
x=Files.createTempDirectory()
//下面呢

def result = x.deleteDir()
assert result
下面呢

def result = x.deleteDir()
assert result

下面的代码将在退出时递归地从临时目录中删除所有文件和文件夹

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')
}

下面的代码将在退出时递归地从临时目录中删除所有文件和文件夹

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')
}

最后
怎么样

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

最后怎么样

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