国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Golang > 正文

go語言制作的zip壓縮程序

2020-04-01 19:15:05
字體:
供稿:網(wǎng)友

這篇文章主要介紹了go語言制作的zip壓縮程序,其主體思路是首先創(chuàng)建一個讀寫緩沖,然后用壓縮器包裝該緩沖,用Walk方法來將所有目錄下的文件寫入zip,有需要的小伙伴參考下。

可以壓縮文件和目錄。

 

 
  1. package main 
  2. import ( 
  3. "archive/zip" 
  4. "bytes" 
  5. "fmt" 
  6. "io/ioutil" 
  7. "os" 
  8. "path/filepath" 
  9. func main() { 
  10. if err := compress(`gopkg`, `gopkg.zip`); err != nil { 
  11. fmt.Println(err) 
  12. // 參數(shù)frm可以是文件或目錄,不會給dst添加.zip擴展名 
  13. func compress(frm, dst string) error { 
  14. buf := bytes.NewBuffer(make([]byte, 0, 10*1024*1024)) // 創(chuàng)建一個讀寫緩沖 
  15. myzip := zip.NewWriter(buf) // 用壓縮器包裝該緩沖 
  16. // 用Walk方法來將所有目錄下的文件寫入zip 
  17. err := filepath.Walk(frm, func(path string, info os.FileInfo, err error) error { 
  18. var file []byte 
  19. if err != nil { 
  20. return filepath.SkipDir 
  21. header, err := zip.FileInfoHeader(info) // 轉(zhuǎn)換為zip格式的文件信息 
  22. if err != nil { 
  23. return filepath.SkipDir 
  24. header.Name, _ = filepath.Rel(filepath.Dir(frm), path) 
  25. if !info.IsDir() { 
  26. // 確定采用的壓縮算法(這個是內(nèi)建注冊的deflate) 
  27. header.Method = 8 
  28. file, err = ioutil.ReadFile(path) // 獲取文件內(nèi)容 
  29. if err != nil { 
  30. return filepath.SkipDir 
  31. else { 
  32. file = nil 
  33. // 上面的部分如果出錯都返回filepath.SkipDir 
  34. // 下面的部分如果出錯都直接返回該錯誤 
  35. // 目的是盡可能的壓縮目錄下的文件,同時保證zip文件格式正確 
  36. w, err := myzip.CreateHeader(header) // 創(chuàng)建一條記錄并寫入文件信息 
  37. if err != nil { 
  38. return err 
  39. _, err = w.Write(file) // 非目錄文件會寫入數(shù)據(jù),目錄不會寫入數(shù)據(jù) 
  40. if err != nil { // 因為目錄的內(nèi)容可能會修改 
  41. return err // 最關(guān)鍵的是我不知道咋獲得目錄文件的內(nèi)容 
  42. return nil 
  43. }) 
  44. if err != nil { 
  45. return err 
  46. myzip.Close() // 關(guān)閉壓縮器,讓壓縮器緩沖中的數(shù)據(jù)寫入buf 
  47. file, err := os.Create(dst) // 建立zip文件 
  48. if err != nil { 
  49. return err 
  50. defer file.Close() 
  51. _, err = buf.WriteTo(file) // 將buf中的數(shù)據(jù)寫入文件 
  52. if err != nil { 
  53. return err 
  54. return nil 

以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 乌拉特后旗| 涟水县| 正蓝旗| 梁山县| 成安县| 名山县| 宣恩县| 深水埗区| 张家港市| 九寨沟县| 大田县| 天水市| 玛沁县| 会东县| 云浮市| 柘城县| 闽侯县| 永修县| 报价| 临夏县| 泾源县| 盈江县| 武定县| 阿鲁科尔沁旗| 松滋市| 涞源县| 怀安县| 唐河县| 稻城县| 定兴县| 磴口县| 濉溪县| 宁德市| 宁波市| 松桃| 武隆县| 巴彦淖尔市| 济阳县| 托里县| 沂源县| 平武县|