现在位置: 首页  >  编程技术  >  Go
golang压缩文件/文件夹,然后上传到ftp,可用于定时备份
0 2983

go压缩文件上传到ftp


一、配置文件

./conf/config.ini

        [ftp]    
        ip=127.0.0.1
        port=21
        user=website
        pass=222222
        path=/backup/
        
        [dir]
        dirPath=Z:\
        dirName=web
        zipPath=Z:\
        zipName=zip.zip
        
        [set]
        timeover_h=23


二、go代码

package main

import (
   "fmt"
   "github.com/aWildProgrammer/fconf"
   "github.com/dutchcoders/goftp"
   "github.com/mholt/archiver"
   "os"
   "time"
)

type ftpConfig struct {
   ip   string
   port string
   user string
   pass string
   path string
}

var fc = new(ftpConfig)
var c *fconf.Config
var ftp *goftp.FTP
var zipfile string

func main() {

   fmt.Println(time.Now())

   initConfig()

   timeover()

   zipfile=compress()

   defer func() {
      fmt.Println("正在删除压缩文件,请稍等...")
      err:=os.Remove(zipfile)
      if err==nil {
         fmt.Println("删除压缩文件完成")
      }else{
         fmt.Println("删除压缩文件失败")
      }
      if err := recover(); err != nil {
         fmt.Println("任务失败,执行终止")
      }
   }()

   uploadToFtp(zipfile)

   fmt.Println("执行完毕,程序将在3秒后退出")
   time.Sleep(3e9)
}

// 读取配置
func initConfig(){
   var err error
   c, err = fconf.NewFileConf("./conf/config.ini")
   if err != nil {
      panic(err)
   }

   fc.ip = c.String("ftp.ip")
   fc.port = c.String("ftp.port")
   fc.user = c.String("ftp.user")
   fc.pass = c.String("ftp.pass")
   fc.path = c.String("ftp.path")
}

// 压缩目录
func compress() string {
   // 压缩文件
   var re []string
   var des string
   re = append(re, c.String("dir.dirPath")+c.String("dir.dirName"))
   des=c.String("dir.zipPath")+c.String("dir.zipName")
   fmt.Println("正在检测同名文件,请稍等...")
   // 处理同名压缩包文件
   var exist_bak bool = false
   _, err := os.Stat(des+".bak")
   if err == nil {
      fmt.Println("存在同名压缩包的bak文件")
      exist_bak=true
   }
   _, err = os.Stat(des)
   if err == nil {
      if exist_bak {
         fmt.Println("正在移除同名文件,请稍等...")
         os.Remove(des)
      }else{
         fmt.Println("正在重命名同名文件,请稍等...")
         os.Rename(des,des+".bak")
      }
   }

   fmt.Println("正在压缩文件,请稍等...")
   err = archiver.Archive(re, des)
   if err != nil {
      fmt.Println("压缩文件失败,程序将在3秒后退出",re,des)
      time.Sleep(3e9)
      panic("")
   }
   return des
}

// 上传ftp
func uploadToFtp(file string){
   // ftp
   fmt.Println("正在连接FTP...")
   ftp, err := goftp.Connect(fc.ip + ":" + fc.port)

   if err != nil {
      fmt.Println("连接FTP失败")
      panic("")
   }

   fmt.Println("正在登录...")
   err = ftp.Login(fc.user, fc.pass)
   if err != nil {
      fmt.Println("登录失败")
      panic("")
   }

   fmt.Println("正在切换目录...")
   err = ftp.Cwd(fc.path)
   if err != nil {
      fmt.Println("切换目录失败")
      panic("")
   }

   fmt.Println("检测日期文件夹是否存在...")
   now:=time.Now()
   day:=now.Format("2006-01-02")
   err = ftp.Cwd(fc.path+day)
   if err == nil {
      fmt.Println("当前日期文件夹已存在")
      panic("")
   }

   fmt.Println("正在创建日期文件夹...")
   err=ftp.Mkd(day)
   if err != nil {
      fmt.Println("创建日期文件夹失败")
      panic("")
   }

   fmt.Println("正在切换日期文件夹目录...")
   err = ftp.Cwd(fc.path+day)
   if err != nil {
      fmt.Println("切换日期文件夹目录失败")
      panic("")
   }



   fmt.Println("正在上传文件...")
   err = ftp.Upload(file)
   if err != nil {
      fmt.Println("上传文件失败")
      panic(err)
   }
   fmt.Println("上传文件成功")

   ftp.Close()
}


// 超时终止退出,未处理未上传完的情况
func timeover() {
   h,_:=c.Int("set.timeover_h")
   s:=time.Duration(h * 60 * 60 * 1e9)
   timer1 := time.NewTimer(s)
   go func(t *time.Timer) {
      for {
         <-t.C

         fmt.Println("程序超时,将自动退出")

         fmt.Println("超时处理,正在断开ftp,请稍等...")
         ftp.Close()

         fmt.Println("超时处理,正在删除压缩文件,请稍等...")
         err:=os.Remove(zipfile)
         if err==nil {
            fmt.Println("超时处理,删除压缩文件完成")
         }else{
            fmt.Println("超时处理,删除压缩文件失败")
         }
         fmt.Println("任务失败,执行超时")
         timer1.Stop()
         os.Exit(0)
      }
   }(timer1)
}


 评论
 站内搜索