代码
删除文件夹中不在给定列表中的文件。
import java.io.IOException;
import java.nio.file.*;
import java.util.List;
import java.util.stream.Collectors;
public class CleanFolderUtil {
public static boolean cleanFolder(Path folder, List<Path> pathsToKeep) {
// 检查文件夹是否存在
if (!Files.exists(folder) || !Files.isDirectory(folder)) {
System.err.println("该路径下文件夹不存在: " + folder);
return false;
}
try (Stream<Path> paths = Files.walk(folder)) {
// 收集所有要删除的文件路径
List<Path> toDelete = paths
.filter(Files::isRegularFile) // 只处理文件
.filter(path -> {
// 检查路径是否匹配要保留的路径列表中的任何一个
for (Path keepPath : pathsToKeep) {
if (folder.relativize(path).equals(keepPath)) {
return false; // 如果找到匹配项,则不删除
}
}
return true; // 如果没有找到匹配项,则删除
})
.collect(Collectors.toList());
// 删除文件
for (Path deletePath : toDelete) {
try {
Files.delete(deletePath);
System.out.println("已经删除: " + deletePath);
} catch (IOException e) {
e.printStackTrace();
// 只记录错误,但继续尝试删除其他文件
}
}
// 检查是否所有要删除的文件都已被删除
return toDelete.stream().noneMatch(Files::exists);
} catch (IOException e) {
e.printStackTrace();
return false; // 如果遍历文件夹失败,则返回 false
}
}
}
例子
假设我们有一个名为example_folder
的文件夹,其中包含以下文件:
example_folder/
├── file1.txt
├── file2.txt
├── subdir/
│ ├── file3.txt
│ └── file4.txt
└── file5.txt
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
// 构造要保留的文件的Path列表
List<Path> pathsToKeep = Arrays.asList(
Paths.get("file1.txt"),
Paths.get("subdir/file4.txt")
);
// 调用CleanFolderUtil来清理文件夹
Path folder = Paths.get("example_folder");
boolean success = CleanFolderUtil.cleanFolder(folder, pathsToKeep);
if (success) {
System.out.println("文件夹清理成功");
} else {
System.out.println("文件夹清理失败");
}
}
}
控制台打印:
Deleted: example_folder/file2.txt
Deleted: example_folder/file5.txt
Deleted: example_folder/subdir/file3.txt
Folder cleaned successfully. Remaining files: [file1.txt, subdir]