package com.zhou.util;
import lombok.SneakyThrows;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
/**
* 删除文件可恢复
* @author lang.zhou
* @since 2023/7/21 14:42
*/
public class FalseFileDelete {
private final File tempDir ;
/**
* 旧文件路径 -> 新文件
*/
private final Map<String,File> tempFileMap = new HashMap<>();
public FalseFileDelete() {
tempDir = Files.createTempDirectory("del-tmp").toFile();
FileUtils.forceMkdir(tempDir);
}
@SneakyThrows
public void delete(File file){
if(file == null || !file.exists()){
return;
}
String path = tempDir + "/" + StringTool.uuid();
FileTool.createDir(path);
String pathName = path + "/" + file.getName();
File newFile = FileUtils.getFile(pathName);
if(file.isDirectory()){
FileUtils.moveDirectory(file, newFile);
}else if(file.isFile()){
FileUtils.moveFile(file, newFile);
}
tempFileMap.put(file.getAbsolutePath(),newFile);
}
/**
* 回滚删除操作
*/
@SneakyThrows
public void rollback(){
if(tempFileMap.size() > 0){
for (String originPath : tempFileMap.keySet()) {
File src = tempFileMap.get(originPath);
if(src.isDirectory()){
FileUtils.moveDirectory(src, FileUtils.getFile(originPath));
}else if(src.isFile()){
FileUtils.moveFile(src, FileUtils.getFile(originPath));
}
}
}
FileUtils.deleteQuietly(tempDir);
tempFileMap.clear();
}
/**
* 提交删除操作
*/
@SneakyThrows
public void submit(){
FileUtils.deleteQuietly(tempDir);
tempFileMap.clear();
}
}
使用方法:
public static void main(String[] args) throws Exception{
System.out.println(System.currentTimeMillis()-t0);
FalseFileDelete delete = new FalseFileDelete();
try{
delete.delete(file);
//do something
delete.submit();
}catch (Exception e){
delete.rollback();
}
}

被折叠的 条评论
为什么被折叠?



