Appearance
项目 3:文件备份工具
自动复制文件
基本文件复制
go
package main
import (
"fmt"
"io"
"os"
)
func copyFile(src, dst string) error {
source, err := os.Open(src)
if err != nil {
return err
}
defer source.Close()
destination, err := os.Create(dst)
if err != nil {
return err
}
defer destination.Close()
_, err = io.Copy(destination, source)
return err
}
func main() {
src := "source.txt"
dst := "backup/source_backup.txt"
// 确保目标目录存在
os.MkdirAll("backup", 0755)
err := copyFile(src, dst)
if err != nil {
fmt.Println("Error copying file:", err)
return
}
fmt.Println("File copied successfully")
}定时任务
使用 time 包实现定时任务
go
package main
import (
"fmt"
"time"
)
func backupTask() {
fmt.Println("Running backup at", time.Now().Format("2006-01-02 15:04:05"))
// 执行备份操作
// copyFile(...)
}
func main() {
fmt.Println("Backup scheduler started")
// 每 1 小时执行一次备份
ticker := time.NewTicker(1 * time.Hour)
defer ticker.Stop()
for {
<-ticker.C
backupTask()
}
}命令行交互
完整代码
go
package main
import (
"flag"
"fmt"
"io"
"os"
"time"
)
func copyFile(src, dst string) error {
source, err := os.Open(src)
if err != nil {
return err
}
defer source.Close()
// 确保目标目录存在
dstDir := dst[:len(dst)-len(os.PathBase(dst))]
if dstDir != "" {
os.MkdirAll(dstDir, 0755)
}
destination, err := os.Create(dst)
if err != nil {
return err
}
defer destination.Close()
_, err = io.Copy(destination, source)
return err
}
func backupTask(src, dst string) {
fmt.Printf("Backing up %s to %s at %s\n", src, dst, time.Now().Format("2006-01-02 15:04:05"))
err := copyFile(src, dst)
if err != nil {
fmt.Println("Error during backup:", err)
return
}
fmt.Println("Backup completed successfully")
}
func main() {
// 解析命令行参数
src := flag.String("src", "", "Source file to backup")
dst := flag.String("dst", "", "Destination path for backup")
interval := flag.Int("interval", 0, "Backup interval in minutes (0 for one-time backup)")
flag.Parse()
if *src == "" || *dst == "" {
fmt.Println("Error: Source and destination must be specified")
flag.Usage()
return
}
if *interval > 0 {
// 定时备份
fmt.Printf("Starting scheduled backup: %s -> %s every %d minutes\n", *src, *dst, *interval)
ticker := time.NewTicker(time.Duration(*interval) * time.Minute)
defer ticker.Stop()
// 立即执行一次备份
backupTask(*src, *dst)
for {
<-ticker.C
backupTask(*src, *dst)
}
} else {
// 一次性备份
backupTask(*src, *dst)
}
}运行方式
一次性备份:
bash$ go run main.go -src=source.txt -dst=backup/source_backup.txt Backing up source.txt to backup/source_backup.txt at 2023-12-25 10:00:00 Backup completed successfully定时备份(每 30 分钟):
bash$ go run main.go -src=source.txt -dst=backup/source_backup.txt -interval=30 Starting scheduled backup: source.txt -> backup/source_backup.txt every 30 minutes Backing up source.txt to backup/source_backup.txt at 2023-12-25 10:00:00 Backup completed successfully // 每 30 分钟自动执行一次备份
功能扩展
- 备份多个文件:使用
[]string类型参数 - 备份目录:递归复制目录内容
- 压缩备份:使用
archive/zip包 - 日志记录:将备份过程记录到日志文件
- 邮件通知:备份完成后发送邮件通知
