如何在Java中以编程方式使用unix命令删除生成的目录

如何在Java中以编程方式使用unix命令删除生成的目录,java,unix,junit,Java,Unix,Junit,我有一个Java代码,在执行后在其中生成目录和文件。目录名如下所示: ef3487f7457-43gfggf545-tgrg4536363-53345 ef3487f7457-43gfggf545-tgrg4536363-53462 ef3487f7457-43gfggf545-tgrg4536363-45742 每个目录中都有文件 如何在java代码中删除这些目录?我不需要它们,它们只是在增加我的磁盘空间使用率。这是我在签入任何内容之前运行的一些单元测试 大概是这样的: @After publ

我有一个Java代码,在执行后在其中生成目录和文件。目录名如下所示:

ef3487f7457-43gfggf545-tgrg4536363-53345

ef3487f7457-43gfggf545-tgrg4536363-53462

ef3487f7457-43gfggf545-tgrg4536363-45742

每个目录中都有文件

如何在java代码中删除这些目录?我不需要它们,它们只是在增加我的磁盘空间使用率。这是我在签入任何内容之前运行的一些单元测试

大概是这样的:

@After
public void afterUnitTestExecution() {

    logger.info("Deleting bullshit files...");
    try {
        java.lang.Runtime.getRuntime().exec("rm -r *-*");
    } catch (IOException e) {
        e.printStackTrace();
    }
}
这段代码看起来应该可以工作,但实际上不行。手动执行
rm-r*-*
可以工作,但在Java中执行(如上所示)不行。怎么了?任何帮助都将不胜感激。谢谢

编辑:


谢谢你们的建议。然而,我不想使用JUnit特有的东西,我更喜欢使用标准的传统Java而不是JUnit来实现我的目标 您应该使用设计用于清理文件的junit规则。JUnit附带了一个专门为这种单元测试设计的

临时文件夹规则允许创建以下文件和文件夹: 应在测试方法完成时删除(无论是否通过) 失败)。用户不检查删除是否成功 这条规则。如果删除失败,将不会引发异常

很容易将其集成到单元测试中:

public static class HasTempFolder {
    @Rule
    public TemporaryFolder folder= new TemporaryFolder();

    @Test
    public void testUsingTempFolder() throws IOException {
        File createdFolder= folder.newFolder("subfolder");
        // Run your code here
    }
}
使用shell代码 您的代码无法工作的原因是java没有像shell那样进行模式扩展,您可以通过启动一个执行删除的shell来模拟这一点:

new ProcessBuilder("sh", "-c", "rm -r *-*").inheritIO().start().waitFor();
使用纯java代码删除目录 您还可以使用纯java代码删除目录,使用
File.listFiles()
结合模式匹配器列出文件,然后调用
File.delete()
删除文件

Java1.8

File f = new File("."); // Cuncurrent directory
Arrays.stream(f.listFiles(fi->fi.getName().match("[0-9a-f-]{36}"))).forEach(File::delete);
Java 1.6及更高版本

File f = new File("."); // Cuncurrent directory
File[] files = f.listFiles(new FileFilter() {
    public boolean accept(File fi) {
        return fi.getName().match("[0-9a-f-]{36}");
    }
});
for(File file : files) {
    file.delete();
}
上面的代码使用regex查找文件,然后调用delete。

使用JUNit TemporaryFolder 您应该使用设计用于清理文件的junit规则。JUnit附带了一个专门为这种单元测试设计的

临时文件夹规则允许创建以下文件和文件夹: 应在测试方法完成时删除(无论是否通过) 失败)。用户不检查删除是否成功 这条规则。如果删除失败,将不会引发异常

很容易将其集成到单元测试中:

public static class HasTempFolder {
    @Rule
    public TemporaryFolder folder= new TemporaryFolder();

    @Test
    public void testUsingTempFolder() throws IOException {
        File createdFolder= folder.newFolder("subfolder");
        // Run your code here
    }
}
使用shell代码 您的代码无法工作的原因是java没有像shell那样进行模式扩展,您可以通过启动一个执行删除的shell来模拟这一点:

new ProcessBuilder("sh", "-c", "rm -r *-*").inheritIO().start().waitFor();
使用纯java代码删除目录 您还可以使用纯java代码删除目录,使用
File.listFiles()
结合模式匹配器列出文件,然后调用
File.delete()
删除文件

Java1.8

File f = new File("."); // Cuncurrent directory
Arrays.stream(f.listFiles(fi->fi.getName().match("[0-9a-f-]{36}"))).forEach(File::delete);
Java 1.6及更高版本

File f = new File("."); // Cuncurrent directory
File[] files = f.listFiles(new FileFilter() {
    public boolean accept(File fi) {
        return fi.getName().match("[0-9a-f-]{36}");
    }
});
for(File file : files) {
    file.delete();
}

上面的代码使用regex查找文件,然后调用delete。

可以使用JUnit的临时文件夹吗?JUnit可以帮你处理这件事。所以您正在使用JUnit,但不想“使用特定于JUnit的内容”?:-|“我更喜欢使用标准的传统Java来实现我的目标”你能使用JUnit的临时文件夹吗?JUnit可以帮你处理这件事。所以您正在使用JUnit,但不想“使用特定于JUnit的内容”?:-|“我更喜欢使用标准的传统Java实现我的目标”我想要删除的目录是由我通过包装代码运行的可执行二进制文件创建的,我没有明确创建这些目录,它们是从执行的二进制文件自动生成的。这似乎对我不起作用。从临时目录运行整个测试,然后使用processbuilder,您可以更改您执行的外部进程的目录。我必须从根项目目录运行它,否则二进制文件将无法工作。不知道为什么这个isI在答案中添加了两种替代方法不幸的是,我重新回到了Java 1.6,你知道你的代码的Java7等价物吗?我想删除的目录是由我通过包装代码运行的可执行二进制文件创建的,我没有明确创建这些目录,它们是从正在执行的二进制文件自动生成的。这似乎对我不起作用。从临时目录运行整个测试,然后使用processbuilder,您可以更改您执行的外部进程的目录。我必须从根项目目录运行它,否则二进制文件将无法工作。不知道为什么这个isI在答案中添加了两种替代方法不幸的是,我重新回到了Java1.6,你知道你的代码的Java7等价物吗?