/*
将指定目录下的.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")
}
文件操作练习
于 2022-03-22 22:46:07 首次发布