Skip to content

项目 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)
    }
}

运行方式

  1. 一次性备份

    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
  2. 定时备份(每 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 分钟自动执行一次备份

功能扩展

  1. 备份多个文件:使用 []string 类型参数
  2. 备份目录:递归复制目录内容
  3. 压缩备份:使用 archive/zip
  4. 日志记录:将备份过程记录到日志文件
  5. 邮件通知:备份完成后发送邮件通知

© 2026 编程马·菜鸟教程 版权所有