国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 延吉市| 黑河市| 静海县| 黎川县| 越西县| 荆州市| 诏安县| 乌审旗| 寿光市| 开鲁县| 鄱阳县| 当阳市| 环江| 呼伦贝尔市| 新巴尔虎左旗| 陇南市| 云南省| 廉江市| 耒阳市| 栖霞市| 台湾省| 红原县| 建平县| 岚皋县| 石楼县| 安多县| 合肥市| 申扎县| 五常市| 和林格尔县| 石河子市| 永州市| 丰都县| 伊通| 拜城县| 道孚县| 班玛县| 寿阳县| 西昌市| 田林县| 中牟县|