习惯把所有的数据文件都放在桌面,有一天系统崩溃,重装系统时差点直接格式化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();
}
}