2016-05-30 34 views
0

zipファイルの変更時刻をtime.Now()に変更するにはどうすればよいですか? zipファイルを作成すると、1979年11月30日00:00の修正時刻が取得されます。Golang:Zip Package Modified Timeデフォルトは1979年11月30日00:00

変更した時刻を今すぐ簡単に設定できますか?

+1

https://golang.org/pkg/archive/zip/#FileHeader.ModTimeまたはファイルヘッダーを使用する必要があります。あなたが使っているコードは何ですか? – khrm

+0

@khrm:基本的にFileHeaderを作成し、それに必要な値を入力してCreateHeaderに渡しますか? FileHeader変数に圧縮されているファイルから(一度に1つの要素をコピーする以外に)値をコピーする方法があるかどうかは疑問です... – G4143

+0

コードスニペットを共有できますか? – khrm

答えて

0

私が探していたこの機能が見つかりました:func FileInfoHeader(fi os.FileInfo)(* FileHeader、error)。これにより、入力データファイルが取得され、部分的にいっぱいのFileHeaderが作成されます。

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()) 
    } 
} 
関連する問題