文件操作练习

/*
将指定目录下的.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")
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值