可能很快删除目录/文件?

时间:2014-06-24 19:44:38

标签: java io

变得奇怪,我希望有人可以帮助我。

我有一个测试类,它在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());
}

1 个答案:

答案 0 :(得分:3)

我不确定文件夹删除失败的原因,但我想建议一种不同的方法。假设您正在运行JUnit,我建议使用Rules feature自动执行临时文件夹创建和删除过程。

对于在整个测试用例期间持续存在的临时文件夹,您需要以下行:

@ClassRule public static TemporaryFolder tempDirectory = new TemporaryFolder();

访问TemporaryFolder实例包装的文件夹

tempDirectory.getRoot()

JUnit将为您创建 BeforeClass 操作的目录,并且还将目录和任何子目录或文件删除为 AfterClass 操作,以便您的大多数设置和拆卸代码变得不必要