JAVA实现桌面备份功能

习惯把所有的数据文件都放在桌面,有一天系统崩溃,重装系统时差点直接格式化C盘,把自己吓得不轻。忽有所感,能每天给桌面文件做一个备份就好了,于是就有了这个小程序。
下面是代码,在eclipse里生成一个jar文件,然后将其快捷方式放到电脑的启动项里,开机后就会自动运行,就可以在每天的凌晨自动把桌面的文件都复制到其他盘,实现自动备份的功能。

package backup;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class Main {

	int maxBackup = 5;  //同时存在的最大备份数

	int cycle = 120;  //定时器的间隔时间,单位为分钟。为减少占用系统资源,可以将这个值设置的比较大一些。程序会在每一天第一次调用定时器时备份文件夹。

	String spacerSymbol = "iwcxgkjlnjhklafwnkcw";  //使用split()函数切割字符串的标识码,可以根据情况自行修改

	String sourceDirectoryPath = "C:\\Users\\18509\\Desktop\\";  //要备份的文件夹路径
	String targetDirectoryPath = "G:\\桌面备份\\";  //存放备份的路径

	String backupDirectoryName;  //备份文件夹名称,组成为 时间戳_日期_时间,例如 1654572619946_2022-06-07_11-30-19
	String backupPath;  //备份路径

	public Main() {
		new Timer().schedule(new TimerTask() {
			public void run() {
				backupDirectoryName = new SimpleDateFormat(System.currentTimeMillis() + "_" + "yyyy-MM-dd_HH-mm-ss").format(new Date(System.currentTimeMillis())) + "\\";
				backupPath = targetDirectoryPath + backupDirectoryName;
				if(isBackupAllowed()) {
					new File(backupPath).mkdirs();  //创建备份文件夹
					copyAllDirectory(sourceDirectoryPath);  //开始备份
				}
			}
		}, 2 * 60 * 1000, cycle * 60 * 1000);
	}

	boolean isBackupAllowed() {
		String[] dir = getMainDirectorySum(targetDirectoryPath);
		if(dir==null) {  //备份地址为空,直接备份
			return true;
		}else {
			if(dir.length < maxBackup) {  //备份小于最大备份数,如果今天已经备份,则不备份
				String today = backupDirectoryName.substring(14, 18) + backupDirectoryName.substring(19, 21) + backupDirectoryName.substring(22, 24);
				for(int i=0; i<dir.length; i++) {
					String s = dir[i].replace(targetDirectoryPath, "");
					s = s.substring(14, 18) + s.substring(19, 21) + s.substring(22, 24);
					if(today.equals(s)) {
						return false;
					}
				}
				return true;
			}else {  //备份等于或者高于最大备份数,首先删除最早的备份,然后递归,直到备份数量小于最大备份数
				String minDirectory = dir[0];
				for(int i=1; i<dir.length; i++) {
					long min = Long.parseLong(minDirectory.replace(targetDirectoryPath, "").substring(0, 13));
					long L2 = Long.parseLong(dir[i].replace(targetDirectoryPath, "").substring(0, 13));
					if(L2 < min) {
						minDirectory = dir[i];
					}
				}
				deleteDirectory(minDirectory);
				return isBackupAllowed();
			}
		}
	}

	void deleteDirectory(String path) {  //删除该文件夹及文件夹下的所有文件(递归方式)
		File[] fs = (new File(path)).listFiles();
		if(fs != null && fs.length > 0) {
			for(File f:fs) {
				if(f.isDirectory()) {
					deleteDirectory(f.getAbsolutePath());
				}else {
					new File(f.getAbsolutePath()).delete();
				}
			}
		}
		new File(path).delete();
	}

	String[] getMainDirectorySum(String path) {  //获取该文件夹下的文件夹(不包括子文件夹,目的是查看备份文件)
		File[] fs = (new File(path)).listFiles();
		if(fs == null) {
			return null;
		}else {
			StringBuffer d = new StringBuffer();
			for(File f:fs) {
				if(!f.isHidden() && f.isDirectory()) {
					d.append(f.getAbsolutePath());
					d.append(spacerSymbol);
				}
			}
			String s = d.toString();
			if(s.length() == 0) {
				return null;
			}else {
				return s.split(spacerSymbol);
			}
		}
	}

	void copyAllDirectory(String path) {  //复制该文件夹下的未隐藏的所有文件及子文件夹到备份文件夹(不包括该文件夹自身)
		File[] fs = (new File(path)).listFiles();
		if(fs != null) {
			for(File f:fs) {
				if(!f.isHidden()) {
					if(f.isDirectory()) {
						new File(backupPath + f.getAbsolutePath().replace(sourceDirectoryPath, "")).mkdirs();
						copyAllDirectory(f.getAbsolutePath());
					}else if(f.isFile()) {
						try {
							Files.copy(f.toPath(), new File(backupPath + f.getAbsolutePath().replace(sourceDirectoryPath, "")).toPath());
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}
			}
		}
	}

	public static void main(String[] args) {
		new Main();
	}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点点 星光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值