实现文件假删除,类似事务的提交和回滚控制

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();
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值