亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將 .gz 文件添加到 tar.gz 文件,但在添加之前解碼 gz。輸出文件被剪裁(損壞)

將 .gz 文件添加到 tar.gz 文件,但在添加之前解碼 gz。輸出文件被剪裁(損壞)

Go
ibeautiful 2023-03-07 10:00:43
下面我有一段代碼,它收集了一些 gzip 壓縮的 PDF 文件。我想將 PDF 添加到tar.gz文件中,但在添加它們之前,它們需要解壓縮 (gzip)。不想以tar.gz充滿pdf.gz文件的方式結束需要在不將整個文件讀入內存的情況下解壓它。中的 PDF 文件tar.gz被剪切和損壞。當我將tar.gz文件與原始 PDF 文件進行比較時,除了tar.gz文件被剪裁之外,它們看起來是一樣的。每個文件的最后一部分丟失// Create new gz writer with compression level 1gzw, _ := gzip.NewWriterLevel(w, 1)defer gzw.Close()// Create new tar writertw := tar.NewWriter(gzw)defer tw.Close()file_path := "path-to-file.pdf.gz"file_name := "filename-shown-in-tar.pdf"// Open file to add to tarfp, err := os.Open(file_path)if err != nil {    log.Printf("Error: %v", err)}defer fp.Close()file_name := file[1]+file_extinfo, err   := fp.Stat()if err != nil {    log.Printf("Error: %v", err)}header, err := tar.FileInfoHeader(info, file_name)if err != nil {    log.Printf("Error: %v", err)}header.Name = file_nametw.WriteHeader(header)// This part will write the *.pdf.gz files directly to the tar.gz file// This part works and it's possible to both open the tar.gz file and// afterwards open the individuel pdf.gz files//io.Copy(tw, fp)// This part decode the gz before adding, but it clips the pdf files in// the tar.gz filegzr, err := gzip.NewReader(fp)if err != nil {    log.Printf("Error: %v", err)}defer gzr.Close()io.Copy(tw, gzr)更新從評論中得到建議,但現在無法打開 tar 中的 PDF 文件。tar.gz 文件已創建并可以打開,但里面的 PDF 文件已損壞已嘗試將輸出文件與tar.gz原始 PDF 進行比較。損壞的文件似乎缺少文件的最后一位。在一個示例中,原始文件有 498 行,而損壞的只有 425 行。但看起來 425 行與原始文件相同。不知何故,最后一點被剪掉了
查看完整描述

1 回答

?
桃花長相依

TA貢獻1860條經驗 獲得超8個贊

問題似乎是您正在根據壓縮的原始文件設置文件信息標頭。特別是,它是導致問題的大小 - 如果您嘗試寫入超過Size標頭中值指示的大小,archive/tar.Writer.Write()將返回ErrWriteTooLong- 請參閱https://github.com/golang/go/blob/d5efd0dd63a8beb5cc57ae7d25f9c60d5dea5c65/ src/archive/tar/writer.go#L428-L429


像下面這樣的東西應該可以工作,從而文件被解壓縮并讀取,以便可以建立準確的大?。?/p>


// Open file to add to tar

fp, err := os.Open(file_path)

if err != nil {

    log.Printf("Error: %v", err)

}

defer fp.Close()


gzr, _ := gzip.NewReader(fp)

if err != nil {

    panic(err)

}

defer gzr.Close()


data, err := io.ReadAll(gzr)

if err != nil {

    log.Printf("Error: %v", err)

}


// Create tar header for file

header := &tar.Header{

    Name: file_name,

    Mode: 0600,

    Size: int64(len(data)),

}


// Write header to the tar

if err = tw.WriteHeader(header); err != nil {

    log.Printf("Error: %v", err)

}


// Write the file content to the tar

if _, err = tw.Write(data); err != nil {

    log.Printf("Error: %v", err)

}


查看完整回答
反對 回復 2023-03-07
  • 1 回答
  • 0 關注
  • 137 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號