变得奇怪,我希望有人可以帮助我。
我有一个测试类,它在C:\ Temp中创建一个临时目录,将一个zip文件复制到它,运行大约31个简单的单元测试,并在关机时删除我的新临时目录。
我注意到当我在“普通模式”下运行该类时,我的新目录没有被删除。
但是,如果我以“调试模式”运行它并逐步执行代码几秒钟,那么在执行结束时,我的新临时目录将被删除。
只是为了踢,我尝试在ShutdownHook开始时加入5秒的睡眠时间,我的新临时目录被删除了,没有任何问题。
那么,我是否有可能过快地创建并尝试删除此目录?
感谢阅读。
创建新临时目录的逻辑:
@BeforeClass
public static void initialSetup(){
//Create temp directory
tempDirectory_Path = Files.createTempDirectory(TEMP_DIRECTORY_NAME);
//Add a ShutdownHook
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run(){
TestTrueZipFileInput.deleteTempDirectory(tempDirectory_Path.toFile());
}
});
//Copy zip file to temp directory
FileUtils.copyFileToDirectory(Paths.get(zip_File_URI).toFile(), tempDirectory_Path.toFile());
}
删除新临时目录的逻辑:
private static boolean deleteTempDirectory(File tempDirectory){
if (tempDirectory.exists()) {
File[] files = tempDirectory.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
deleteTempDirectory(files[i]);
}else {
files[i].delete();
};
}
}
return (tempDirectory.delete());
}
将Sleep值添加到ShutDownHook:
@BeforeClass
public static void initialSetup(){
//Create temp directory
tempDirectory_Path = Files.createTempDirectory(TEMP_DIRECTORY_NAME);
//Add a ShutdownHook
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run(){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
System.out.println("Error during sleep");
e.printStackTrace();
}
System.out.println("Deleting Directory: " + tempDirectory_Path.toString());
TestTrueZipFileInput.deleteTempDirectory(tempDirectory_Path.toFile());
}
});
//Copy zip file to temp directory
FileUtils.copyFileToDirectory(Paths.get(zip_File_URI).toFile(), tempDirectory_Path.toFile());
}
答案 0 :(得分:3)
我不确定文件夹删除失败的原因,但我想建议一种不同的方法。假设您正在运行JUnit,我建议使用Rules feature自动执行临时文件夹创建和删除过程。
对于在整个测试用例期间持续存在的临时文件夹,您需要以下行:
@ClassRule public static TemporaryFolder tempDirectory = new TemporaryFolder();
访问TemporaryFolder实例包装的文件夹
tempDirectory.getRoot()
JUnit将为您创建 BeforeClass 操作的目录,并且还将目录和任何子目录或文件删除为 AfterClass 操作,以便您的大多数设置和拆卸代码变得不必要