kjk
10/3/2014 - 8:33 PM

how to compress multiple files to a single file using bzip2, in Go

how to compress multiple files to a single file using bzip2, in Go

func bz2CompressFiles(dstPath string, srcFiles []string) {
	os.Remove(dstPath)

	fileOut, err := os.Create(dstPath)
	u.PanicIfErr(err)

	cmd := exec.Command("bzip2", "--best", "-z")
	cmd.Stdout = fileOut
	stdin, err := cmd.StdinPipe()
	u.PanicIfErr(err)
	err = cmd.Start()
	u.PanicIfErr(err)

	var srcSize int64
	for _, fileName := range srcFiles {
		fi, err := os.Stat(fileName)
		u.PanicIfErr(err)
		srcSize += fi.Size()
		r, err := os.Open(fileName)
		u.PanicIfErr(err)
		_, err = io.Copy(stdin, r)
		u.PanicIfErr(err)
		r.Close()
	}
	err = stdin.Close()
	u.PanicIfErr(err)
	err = cmd.Wait()
	u.PanicIfErr(err)
	err = fileOut.Close()
	u.PanicIfErr(err)

	fi, err := os.Stat(dstPath)
	u.PanicIfErr(err)
	srcSizeStr := humanize.Bytes(uint64(srcSize))
	dstSizeStr := humanize.Bytes(uint64(fi.Size()))
	fmt.Printf("compressed %s to %s, %d files to %s\n", srcSizeStr, dstSizeStr, len(srcFiles), dstPath)
	for i := 0; i < len(srcFiles) && i < 0; i++ {
		fmt.Printf("%s\n", srcFiles[i])
	}
}