关闭

golang 大文件分割

404人阅读 评论(0) 收藏 举报
golang 大文件分割
  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "math"
  6. "os"
  7. "strconv"
  8. )
  9. const chunkSize int64 = 4 << 20
  10. func main() {
  11. fileInfo, err := os.Stat("test.zip")
  12. if err != nil {
  13. fmt.Println(err)
  14. }
  15. num := int(math.Ceil(float64(fileInfo.Size()) / float64(chunkSize)))
  16. fi, err := os.OpenFile("test.zip", os.O_RDONLY, os.ModePerm)
  17. if err != nil {
  18. fmt.Println(err)
  19. return
  20. }
  21. b := make([]byte, chunkSize)
  22. var i int64 = 1
  23. for ; i <= int64(num); i++ {
  24. fi.Seek((i-1)*(chunkSize), 0)
  25. if len(b) > int((fileInfo.Size() - (i-1)*chunkSize)) {
  26. b = make([]byte, fileInfo.Size()-(i-1)*chunkSize)
  27. }
  28. fi.Read(b)
  29. f, err := os.OpenFile("./"+strconv.Itoa(int(i))+".db", os.O_CREATE|os.O_WRONLY, os.ModePerm)
  30. if err != nil {
  31. fmt.Println(err)
  32. return
  33. }
  34. f.Write(b)
  35. f.Close()
  36. }
  37. fi.Close()
  38. fii, err := os.OpenFile("test.zip", os.O_CREATE|os.O_WRONLY|os.O_APPEND, os.ModePerm)
  39. if err != nil {
  40. fmt.Println(err)
  41. return
  42. }
  43. for i := 1; i <= num; i++ {
  44. f, err := os.OpenFile("./"+strconv.Itoa(int(i))+".db", os.O_RDONLY, os.ModePerm)
  45. if err != nil {
  46. fmt.Println(err)
  47. return
  48. }
  49. b, err := ioutil.ReadAll(f)
  50. if err != nil {
  51. fmt.Println(err)
  52. return
  53. }
  54. fii.Write(b)
  55. f.Close()
  56. }
  57. }
复制代码www.kmnk01.com www.jjg3.com
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:37775次
    • 积分:2047
    • 等级:
    • 排名:第18712名
    • 原创:168篇
    • 转载:34篇
    • 译文:1篇
    • 评论:3条
    文章分类