Golang:Zip Package Modified Time默认为1979年11月30日00:00

时间:2016-05-30 04:27:35

标签: go

如何将zip文件的修改时间更改为time.Now()?当我创建一个zip文件时,我的修改时间是1979年11月30日00:00。

那么有一种简单的方法可以将修改时间设置为现在吗?

2 个答案:

答案 0 :(得分:0)

我发现这个函数可以完成我想要的:func FileInfoHeader(fi os.FileInfo)(* FileHeader,error)。这将获取输入数据文件并创建部分填充的FileHeader。

答案 1 :(得分:0)

我现在可以使用输入文件的os.FileInfo作为FileHeader,但压缩率几乎是1:1 ......这意味着它现在几乎不压缩文件。如果我不使用CreateHeader,那么我获得了良好的压缩比。有谁知道为什么?这是我试过的代码..

package main

import (
    "archive/zip"
    "bytes"
    "fmt"
    "os"
    "strings"
)

func main() {
    fmt.Println("Zip Program!\n\n")

    zbuf := new(bytes.Buffer)

    fmt.Print("Enter input filename: ")
    var ifilename string
    fmt.Scanf("%s", &ifilename)

    if ifd, err := os.Open(ifilename); err == nil {
        ibuf := make([]byte, 128)
        zwtr := zip.NewWriter(zbuf)
        fi, _ := ifd.Stat()              //call stat() to get os.FileInfo
        fih, _ := zip.FileInfoHeader(fi) //get FileHeader from input file

        if zw, err := zwtr.CreateHeader(fih); err == nil { //use input file header
            for true {
                if ird, err := ifd.Read(ibuf); err == nil {
                    //fmt.Printf("%s", ibuf[:ird])
                    zw.Write(ibuf[:ird])
                } else {
                    ifd.Close()
                    zwtr.Close()
                    break
                }
            }
        } else {
            fmt.Println(err.Error())
        }
    } else {
        fmt.Println(err.Error())
    }

    fmt.Printf("Buf size: %d\n", len(zbuf.Bytes()))

    fmt.Print("Enter zip filename: ")
    var zfilename string
    fmt.Scanf("%s", &zfilename)

    if !strings.HasSuffix(zfilename, ".zip") {
        zfilename += ".zip"
    }

    if zfd, err := os.Create(zfilename); err == nil {
        if _, err := zfd.Write(zbuf.Bytes()); err == nil {

        } else {
            fmt.Print(err.Error())
        }
    } else {
        fmt.Println(err.Error())
    }
}