递归删除类文件

时间:2015-03-18 22:58:26

标签: java class recursion

所以我试图在Unix中创建一个程序,它将一个目录作为参数,然后递归遍历,打开所有文件夹,查看所有文件,然后删除所有类文件。我以为我正在采取正确的步骤,因为我获得了类似程序的代码,并被告知将其用作基础,但在测试我的程序时,我发现没有任何反应。

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.ParseException;

public class ClassFileDeleter {
    public static void main(String[] args) throws ParseException {
    String dirName = args[0];
    deleteFile(dirName);
}

private static void deleteFile(String dirName) {
    Path path = Paths.get(dirName);
    File dir = path.toFile();

    if(dir.exists()) {
    File[] files = dir.listFiles();
    if(dir.isDirectory()) {
    for(File f:files) {
    if(!f.isDirectory())
            if(f.toString().endsWith(".class"))
            System.out.println("yes");
            else deleteFile(dirName + "/" + f.getName());

    }}}
    }}

我对自己应该做的事感到茫然。我还没有尝试删除任何东西因为我不想删除任何不是类文件的东西所以我使用了一些虚拟代码,一旦程序找到一个类文件就应该打印'yes'。但是,当我运行我的代码时,绝对没有任何反应。我相信我搜索类文件的方式存在问题(我们应该使用endsWith)或者我尝试使用递归查看指定目录中的所有文件的方式。如果我能得到一些帮助,那就太好了。

2 个答案:

答案 0 :(得分:2)

我将从isFile检查开始(然后测试文件的扩展名并记录它是否匹配),然后您可以递归地下降任何目录。像,

private static void deleteFile(String dirName) {
    File dir = new File(dirName);
    if (dir.isFile()) {
        if (dir.getName().endsWith(".class")) {
            try {
                System.out.println("Delete: " + dir.getCanonicalPath());
                // dir.delete();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    } else if (dir.isDirectory()) {
        File[] files = dir.listFiles();
        for (File f : files) {
            try {
                deleteFile(f.getCanonicalPath());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

答案 1 :(得分:0)

令我感到震惊的是,您必须通过目录递归的代码是创建文件对象而不是目录。

快速谷歌通过Oracle java教程(http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#listdir)给了我这个。

  

列出目录的内容

     

您可以使用newDirectoryStream(Path)方法列出目录的所有内容。此方法返回实现DirectoryStream接口的对象。实现DirectoryStream接口的类也实现了Iterable,因此您可以遍历目录流,读取所有对象。这种方法适用于非常大的目录。   请记住:返回的DirectoryStream是一个流。如果您没有使用try-with-resources语句,请不要忘记关闭finally块中的流。 try-with-resources语句会为您解决此问题。

     

以下代码段显示了如何打印目录的内容:

Path dir = ...;
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
    for (Path file: stream) {
        System.out.println(file.getFileName());
    }
} catch (IOException | DirectoryIteratorException x) {
    // IOException can never be thrown by the iteration.
    // In this snippet, it can only be thrown by newDirectoryStream.
    System.err.println(x);
}
  

迭代器返回的Path对象是针对目录解析的条目的名称。因此,如果要列出/ tmp目录的内容,则返回的条目格式为/ tmp / a,/ tmp / b,依此类推。

     

此方法返回目录的全部内容:文件,链接,子目录和隐藏文件。如果您希望对检索的内容更具选择性,可以使用其他newDirectoryStream方法之一,如本页后面所述。

     

请注意,如果在目录迭代期间发生异常,则抛出DirectoryIteratorException,并将IOException作为原因。迭代器方法不能抛出异常异常。

所以我看看那里,看看你能做些什么。