列出目录中缺少的文件并删除任何额外的文件

时间:2016-05-16 15:10:44

标签: java arrays list

我试图找出如何将目录中的文件与已批准文件列表进行比较的方法。我想显示丢失的文件,也删除任何额外的文件。

我的代码 -

String[] approvedFiles = {"AAA.enc","LCQ.enc","MZXA.enc", "BBB.enc"};
    File folder = new File("test/");
    File[] listOfFiles = folder.listFiles();

    for (int i = 0; i < listOfFiles.length; i++) {
        //if (How to compare here?)
            System.err.println("File " + approvedFiles[i] + " missing.");
    }

我将如何实现这一目标?

4 个答案:

答案 0 :(得分:0)

一种简单的方法是将批准的文件数组和当前文件数组转换为集合,然后减去它们。

我首先创建一个地图,它将您手头的文件的字符串名称与实际对应的File对象相关联。从approvedFilesSet中减去此映射的密钥集会产生额外的文件。如果您还需要删除这些文件,地图会派上用场,因为可以从查找中获取原始File对象。

String[] approvedFiles = {"AAA.enc","LCQ.enc","MZXA.enc", "BBB.enc"};
Set<String> approvedFilesSet = new HashSet<String>(Arrays.asList(approvedFiles));
File folder = new File("test/");
File[] listOfFiles = folder.listFiles();

Map<String, File> haveFilesMap = new HashMap<>();
for (File file : listOfFiles) {
    if (file.isFile()) {
        haveFilesMap.put(file.getName(), file);
    }
}

// subtract the have files from the approved files
approvedFilesSet.removeAll(haveFilesMap.keySet());

for (String file : approvedFilesSet) {
    System.err.println("File " + file + " missing.");

    // uncomment the following if you also want to delete these extra files
    /*
    try {
        Files.delete(haveFilesMap.get(file).toPath());
    }
    catch (Exception e) {
        System.err.println("Error deleting file " + file);
    }
    */
}

答案 1 :(得分:0)

您希望遍历要比较的文件夹中的文件以及每个文件,看看它是否在approvedFiles列表中。如果是,则不执行任何操作(或打印“找到的文件”。如果找不到,请打印“未知文件”。验证工作正常后,可以将其更改为删除未知文件

答案 2 :(得分:0)

您可以将approvedFiles的数据结构转换为Set,然后使用remove操作。 E.g。

Set<String> approvedFiles = new HashSet<String({"AAA.enc","LCQ.enc","MZXA.enc", "BBB.enc"});
File folder = new File("test/");
File[] listOfFiles = folder.listFiles();
for (File file : listOfFiles) {
        approvedFiles.remove(listOfFiles[i].getName());
}
for (String missingFile : approvedFiles) {
   System.out.println("File " + missingFile + " is missing");
}

答案 3 :(得分:0)

从蒂姆的回答中得到提示,我认为这会让你找到丢失的文件并删除额外的文件。这个答案使用Java 8 foreach循环

String[] approvedFiles = {"AAA.enc","LCQ.enc","MZXA.enc", "BBB.enc"};
Set<String> approvedFilesSet = new HashSet<String>(Arrays.asList(approvedFiles));
File folder = new File("test/");
File[] listOfFiles = folder.listFiles();

listOfFiles.forEach(file -> {
    if (!approvedFilesSet.remove(file)) {
        // Delete the extra file
        try {
            Files.delete(file);
        } catch(Exception e) {
            System.err.println("Error deleting file "+ file);
        }
    }
});

System.out.println("Missing Files: "+ approvedFilesSet);