文件操作练习

/*
将指定目录下的.txt后缀结尾的文件合并成一个大文件  travers_dir()、write_file()
然后将大文件进行一个压缩    compress_file()
(假如读文件都成功,不用判断err)
*/
package main

import (
	"bytes"
	"compress/zlib"
	"fmt"
	"io"
	"io/ioutil"
	"os"
	"strings"
)

//将所有.txt后缀文件的字节数据合并到一个大的字节buffer中(定义的bs)
func travers_dir(dir string, bs *bytes.Buffer) {
	fileinfos, err := ioutil.ReadDir(dir) //列出指定目录下的文件列表
	if err != nil {
		fmt.Println(err)
		return
	}
	for _, fileinfo := range fileinfos { //开始便利
		if fileinfo.IsDir() { //如果是目录,则递归调用
			travers_dir(dir+"\\"+fileinfo.Name(), bs)
		} else if fileinfo.Mode().IsRegular() && strings.HasSuffix(fileinfo.Name(), ".txt") { //如果是文件且是.txt后缀
			barr := make([]byte, 1000)
			fileFullpath := dir + "\\" + fileinfo.Name()
			if file, err := os.Open(fileFullpath); err != nil {
				fmt.Println(err)
				return
			} else {
				if n, err := file.Read(barr); err == nil { //如果读成功,则将数据写入bs中
					bs.Write(barr[:n])
				}
				file.Close()
			}
		}
	}
}

//将buffer中(定义的bs)中的数据写入一个大的文件中
func write_file(bs bytes.Buffer, outFile string) {
	file, _ := os.OpenFile(outFile, os.O_CREATE|os.O_TRUNC|os.O_RDWR, os.ModePerm)
	file.Write(bs.Bytes()) //将bs中的字节写入
	file.Close()
}

//将整合的大文件进行一个压缩
func compress_file(inFile string, outFile string) {
	fin, _ := os.Open(inFile)
	fout, _ := os.OpenFile(outFile, os.O_CREATE|os.O_TRUNC|os.O_RDWR, os.ModePerm)
	writer := zlib.NewWriter(fout) //创建zlib对象
	bc := make([]byte, 10)
	for {
		n, err := fin.Read(bc)
		if err != nil {
			if err == io.EOF {
				break
			}
			fmt.Println(err)
			return
		}
		writer.Write(bc[:n])
	}
	fin.Close()
	fout.Close()
	writer.Close()
}

func main() {
	bs := bytes.Buffer{}
	travers_dir("E:\\goproject\\io", &bs)
	write_file(bs, "out.test")
	compress_file("out.test", "ldy.zlib")
}

你可能感兴趣的:(GO,golang)