SpringBoot中删除mysql和磁盘一个月之前的记录和文件(扫描所有文件、获取文件创建时间)

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 SpringBoot中删除mysql和磁盘一个月之前的记录和文件(扫描所有文件、获取文件创建时间),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

场景

聊天室功能,需要定期删除msyql中一个月之前的数据以及磁盘上存储的语音等文件。

磁盘下存储的文件按照年月日分目录存储,所以可以扫描指定目录下所有的文件并获取每个

文件的创建时间进行比较并删除。

SpringBoot中删除mysql和磁盘一个月之前的记录和文件(扫描所有文件、获取文件创建时间)

 

文件的上传和按照时间目录存储直接采用如下开发框架自带方法

若依前后端分离版本地搭建开发环境并运行项目的教程:

若依前后端分离版手把手教你本地搭建环境并运行项目_霸道流氓气质的博客-CSDN博客_前后端分离项目本地运行

注:

博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

1、删除mysql中一个月之前的消息记录

    <delete id="deleteChatRoomMessageBeforeOneMonth" >
        DELETE FROM chat_room_message where  date_add(curdate(),INTERVAL -1 month) > send_time;
    </delete>

其中send_time是删除的时间依据,即判断该字段小于当前时间减一个月则删除。

2、通过递归方法获取某磁盘路径下所有文件

    /**
     *
     * @param dirFilePath
     * @return
     */
    public static List<File> getAllFile(String dirFilePath) {
        if (StrUtil.isBlank(dirFilePath))
            return null;
        return getAllFile(new File(dirFilePath));
    }

    /**
     * 获取指定文件夹下所有文件,不含文件夹里的文件
     *
     * @param dirFile 文件夹
     * @return
     */
    public static List<File> getAllFile(File dirFile) {
        // 如果文件夹不存在或着不是文件夹,则返回 null
        if (Objects.isNull(dirFile) || !dirFile.exists() || dirFile.isFile())
            return null;

        File[] childrenFiles = dirFile.listFiles();
        if (Objects.isNull(childrenFiles) || childrenFiles.length == 0)
            return null;

        List<File> files = new ArrayList<>();
        for (File childFile : childrenFiles) {
            // 如果是文件,直接添加到结果集合
            if (childFile.isFile()) {
                files.add(childFile);
            }
            //以下几行代码取消注释后可以将所有子文件夹里的文件也获取到列表里
            else {
                // 如果是文件夹,则将其内部文件添加进结果集合
                List<File> cFiles = getAllFile(childFile);
                if (Objects.isNull(cFiles) || cFiles.isEmpty()) continue;
                files.addAll(cFiles);
            }
        }
        return files;
    }

3、获取某个文件的创建时间

Files.readAttributes(Paths.get(file.getAbsolutePath()), BasicFileAttributes.class).creationTime()

4、使用stream的filter方法过滤一个月之前创建的文件

        list.stream().filter(file -> {
            try {
                return new Date().getTime() - Files.readAttributes(Paths.get(file.getAbsolutePath()), BasicFileAttributes.class).creationTime().toMillis()>1000*60*60*24*17;
            } catch (IOException e) {
                e.printStackTrace();
            }
            return false;
        })

5、将一个月之前的文件遍历删除

        list.stream().filter(file -> {
            try {
                return new Date().getTime() - Files.readAttributes(Paths.get(file.getAbsolutePath()), BasicFileAttributes.class).creationTime().toMillis()>1000*60*60*24*17;
            } catch (IOException e) {
                e.printStackTrace();
            }
            return false;
        }).forEach(file -> {
            try {
                Files.deleteIfExists(Paths.get(file.getAbsolutePath()));
            } catch (IOException e) {
                e.printStackTrace();
            }
        });

6、定时任务实现

启动类添加@EnableScheduling注解

@SpringBootApplication
@EnableScheduling
public class ImserverApplication {
    public static void main(String[] args) {
        //SpringApplication.run(ImserverApplication.class, args);
    }
}

定时任务配置类添加@Configuration注解并在具体执行的方法中添加@Scheduled注解并配置cron表达式

完整示例代码

package com.chrisf.task;

import cn.hutool.core.util.StrUtil;
import com.chrisf.config.RuoYiConfig;
import com.chrisf.mapper.ChatRoomMessageMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Scheduled;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

@Configuration
public class DeleteVoiceFileTask {

    @Autowired
    private ChatRoomMessageMapper chatRoomMessageMapper;

    @Scheduled(cron = "0 0 0 * * ?")
    public void testSchedule4(){
        //删除聊天室消息中一个月之前的数据
        chatRoomMessageMapper.deleteChatRoomMessageBeforeOneMonth();
        //删除磁盘录音文件
        // 上传文件路径
        String filePath = RuoYiConfig.getUploadPath();
        List<File> list = getAllFile(filePath);
        list.stream().filter(file -> {
            try {
                return new Date().getTime() - Files.readAttributes(Paths.get(file.getAbsolutePath()), BasicFileAttributes.class).creationTime().toMillis()>1000*60*60*24*30;
            } catch (IOException e) {
                e.printStackTrace();
            }
            return false;
        }).forEach(file -> {
            try {
                Files.deleteIfExists(Paths.get(file.getAbsolutePath()));
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }

    /**
     *
     * @param dirFilePath
     * @return
     */
    public static List<File> getAllFile(String dirFilePath) {
        if (StrUtil.isBlank(dirFilePath))
            return null;
        return getAllFile(new File(dirFilePath));
    }

    /**
     * 获取指定文件夹下所有文件,不含文件夹里的文件
     *
     * @param dirFile 文件夹
     * @return
     */
    public static List<File> getAllFile(File dirFile) {
        // 如果文件夹不存在或着不是文件夹,则返回 null
        if (Objects.isNull(dirFile) || !dirFile.exists() || dirFile.isFile())
            return null;

        File[] childrenFiles = dirFile.listFiles();
        if (Objects.isNull(childrenFiles) || childrenFiles.length == 0)
            return null;

        List<File> files = new ArrayList<>();
        for (File childFile : childrenFiles) {
            // 如果是文件,直接添加到结果集合
            if (childFile.isFile()) {
                files.add(childFile);
            }
            //以下几行代码取消注释后可以将所有子文件夹里的文件也获取到列表里
            else {
                // 如果是文件夹,则将其内部文件添加进结果集合
                List<File> cFiles = getAllFile(childFile);
                if (Objects.isNull(cFiles) || cFiles.isEmpty()) continue;
                files.addAll(cFiles);
            }
        }
        return files;
    }

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135895.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!