我试图找出如何将目录中的文件与已批准文件列表进行比较的方法。我想显示丢失的文件,也删除任何额外的文件。
我的代码 -
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.");
}
我将如何实现这一目标?
答案 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);