Java实现定时删除ftp上的文件以及对应的文件夹

       在做项目中,需要使用Java定时删除ftp上的图片以及这个图片对应的文件夹,摸索了很长时间,才决定取巧完成这个功能,在开发设计时,这个文件夹中的命名为时间格式的,比如2018-06-06,每天会自动生成这样一个文件存储所有的 .jpg格式的图片,所以这样会很好删除,我也参考了其他的删除文件以及文件夹的方法,但是都没成功,努力了一个礼拜才总算解决好这个问题。

1.我在IDEA构建的是一个spring-boot项目,其他配置我就不写了,我在这里需要引入的包为

2.创建一个controller层方法,因为还有一个定时任务,所以我直接写在里面,节省时间,CarPassinfo是我的一个实体类名称,CommonUtils也是自己编写的一个工具包,这里设置的是定时删除8天前的数据,然后用在FtpUtils中比较文件夹的名称跟当前日期对应的8天前日期大小,比8天前小,执行删除,大于8天,跳过。

package com.ssist.modules.CarPassinfo.web;

import com.ssist.common.utils.CommonUtils;
import com.ssist.common.utils.FtpUtils;
import com.ssist.common.web.BaseController;
import com.ssist.modules.CarPassinfo.service.CarPassinfoService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;


@RestController
public class CarPassinfoController extends BaseController implements ServletContextListener {

    private Logger logger = LoggerFactory.getLogger(getClass());
 
    @ResponseBody
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        Timer timer = new Timer();
        //设置一个定时任务
        timer.schedule(new TimerTask() {
            public void run() {
                
                //二、定时删除服务器里面的存储的文件夹
                // 1.动态获取当前日期格式2018-12-05
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                Calendar c2 = Calendar.getInstance();
                c2.setTime(new Date());
                c2.add(Calendar.DATE , -8);
                Date d2 = c2.getTime();
                String day2 = sdf.format(d2);
//                System.out.println("今天时间为:"+day2);
                // 调用工具类删除服务器文件夹
                FtpUtils ftp = new FtpUtils();
                //传递过去的文件夹名称是2018-00-00格式
                //读取配置文件里面设置的参数,下面的day2是我获取当前时间所对应的文件夹名称,可                
                //以转换成filename
                String hostname = CommonUtils.props.getProperty("hostname");//ip
                int port = Integer.valueOf(CommonUtils.props.getProperty("port"));//端口号
                String username = CommonUtils.props.getProperty("username");
                String password = CommonUtils.props.getProperty("password");
                String pathname = CommonUtils.props.getProperty("pathname");//路径
                ftp.deleteDirOrFile(hostname,port,username,password,pathname,day2);
            }
        },0,86400000);
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {

    }
}

3.创建一个FtpUtils工具类,里面有删除文件以及文件夹的方法。

package com.ssist.common.utils;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

import java.io.IOException;
import java.net.MalformedURLException;

public class FtpUtils {

    public FTPClient ftpClient = null;

    /**
     * 初始化ftp服务器
     */
    public void initFtpClient(String hostname,int port,String username,String password){
        ftpClient = new FTPClient();
        ftpClient.setControlEncoding("UTF-8");
        try {
            System.out.println("connecting...服务器"+hostname+":"+port);
            ftpClient.connect(hostname,port);//连接ftp服务器
            ftpClient.login(username,password);//登录ftp服务器
            int replyCode = ftpClient.getReplyCode();//是否成功登录服务器
            if (!FTPReply.isPositiveCompletion(replyCode)){
                System.out.println("connect failed...ftp服务器:"+hostname+":"+port);
            }
            System.out.println("connect successful...ftp服务器:"+hostname+":"+port);
        } catch (MalformedURLException e){
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //删除当前日期8天前的文件夹
    public void deleteDirOrFile(String hostname,int port,String username,String password,String pathname,String filename){
        try {
            initFtpClient(hostname,port,username,password);
            if (pathname == null){
                return;
            }
            FTPFile[] files = ftpClient.listFiles(pathname);
            for (FTPFile f : files){
                if (f.isDirectory()){
                    String dirname = f.getName();
                    //获取内部文件夹名称后格式化处理。判断其时间是否在当前时间的8天前
                    int result= dirname.compareTo(filename);
                    if (result >= 0){
                        return;
                    }else{
                        //切换FTP目录,还是当前目录
                        ftpClient.changeWorkingDirectory(pathname);
                        if (dirname == null){
                            return;
                        }
                        FTPFile[] files2 = ftpClient.listFiles(dirname);
                        for (FTPFile f2 : files2){
                            if (f2.isFile() && f2.toString().contains(".jpg") || f2.isFile() && f2.toString().contains(".JPG")){
                                ftpClient.dele(pathname+"/"+dirname+"/"+f2.getName());
                                System.out.println("删除图片成功");
                            }else if (f2.isDirectory()){
                                ftpClient.removeDirectory(pathname+"/"+f2);
                                System.out.println("删除子图片文件夹成功");
                            }
                        }
                        ftpClient.removeDirectory(pathname+"/"+f.getName());
                        System.out.println("删除图片文件夹成功");
                    }
                }else if (f.isFile()){
                    return;
                }
            }
            ftpClient.logout();
            return;
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

4.还有配置文件application.properties

#定时删除ftp上的图片
hostname=192.168.xx.xx
port=21
username=xxxx
password=xxxx
pathname=/home/picture/xxxx   //自己的路径

5.自己编写一个测试方法,能够启动,都会先删除内部图片,然后在删除文件夹,如果有图片格式不一样,在逻辑判断中修改,有些文件夹中可能既有文件,又有文件夹,这个我也没想号怎么删除,我也参考了很多,但是都是无法正常删除,推荐两个网址,大家可以自己去看看:https://blog.csdn.net/justry_deng/article/details/82866777?utm_source=blogxgwz0

   https://www.cnblogs.com/weihbs/p/7760552.html

我想了整一个礼拜,才总算做出来了,希望能给大家带来帮助,分享一下!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值