Go os,bufio,ioutil包 对文件读取写入小结 和文件/文件夹是否存在

对单个文件读取写入  带缓冲区  bufio包


打开一个存在的文件,并且将原来的内容覆盖为新的内容。这里不需要创建文件所以不需要使用

os.O_CREATE。
os.O_TRUNC | os.O_WRONLY 以写的方式打开已经存在的文件,在写之前清空文件里面的内容。
fileSd,err := os.OpenFile("test.txt",os.O_TRUNC | os.O_WRONLY,os.ModePerm)
	if err != nil{
		fmt.Println("open file error:",err)
		return
	}

	//及时关闭file文件句柄
	defer fileSd.Close()

	//写入的时候,使用带缓存的 *Writer
	writer := bufio.NewWriter(fileSd)

	for i := 0; i < 5; i++{
		writer.WriteString("hh\r\n") //表示换行,为了在记事本和其他编辑器都可以看到换行效果
	}

	writer.Flush()

如果要在原来文件内容的后面追加,并不是将原来的文件覆盖掉,比如在写日志的时候是追加写。

下面是追加的形式,就不是覆盖写了。

	fileSd,err := os.OpenFile("test.txt",os.O_APPEND | os.O_WRONLY,os.ModePerm)

再接下来就是打开一个文件,将原来的内容读出来显示在终端,并且追加。这就需要文件是以读写的方式打开,并且以追加的方式打开。

这里面关键就是告诉其以读写到方式打开,写到时候以追加到方式往里面写。

fileSd,err := os.OpenFile("test.txt",os.O_APPEND | os.O_RDWR,0666)

	reader := bufio.NewReader(fileSd)
	fmt.Println(reader)

	for  {
		content,err := reader.ReadString('\n')
		if err == io.EOF{ //如果读取到文件到末尾就不读了
			break
		}
		fmt.Println(content,err)
	}

不带缓冲区,一次性读写


编写一个程序,将一个文件内容,写入到另外一个文件,这两个文件都是存在的。

使用ioutil.ReadFile /ioutil.WriteFile 完成写文件的任务。

	filePath := "test.txt"

	//将文件的内容读取到内存,
	content,err := ioutil.ReadFile(filePath)

	if err != nil { //说明读取文件出错了,将错误信息输出,然后退出
		fmt.Println("read fiile error:",err)
		return  //文件读取失败就结束了,不能往下走了
	}

	fmt.Println(string(content))

	//将读取到到内容写入到文件里面
	err = ioutil.WriteFile("test1.txt",content,os.ModePerm)

	if err != nil{
		fmt.Println("write file error:",err)
	}

思路其实也和下面这个步骤一样,打开一个文件,然后创建一个文件,从打开的文件当中使用死循环不断向目标文件里面写入数据。

  1. srcf = open(src)
  2. dstf= create(dst)
  3. read srcf=>ctx
  4. writer dstf ctx=>
  5. srcf.close dstf.close()

io包里面有copy函数,这个copy函数其实就是从src里面读取内容,然后写到dst里面去。下面就是不断从文件当中读取内容,往标准输出上面去写。

	file,_ := os.Open("test.txt")
	defer file.Close()

	io.Copy(os.Stdout,file)

判断是文件还是目录


操作目录,对目录的读取。

	path := "test"
	fileSd,err := os.Open(path)
	fmt.Println(fileSd,err)
	if err != nil{
		return
	}
	defer fileSd.Close()

	contents := make([]byte,10)
	n,err := fileSd.Read(contents)
	fmt.Println(n,err)

如果是一个目录,就不能读取里面的内容。所以这里还得判断是文件还是目录。 

0 read test: is a directory

func (*File) Stat 

下面就是将文件的名称,判断是否为目录这些等都打印出来。 

 fileInfo,err := fileSd.Stat()
    if err != nil{
    	fmt.Println(err)
	}
	fmt.Println(fileInfo.Name(),fileInfo.IsDir(),fileInfo.Mode(),fileInfo.ModTime().Format("2006-01-02 15:04:05"),fileInfo.Size())


test true drwxr-xr-x 2022-03-22 18:57:19 64

获取目录下面所有文件的信息


func (*File) Readdirnames 

 -1代表将当前文件夹下面的文件名称全部读取出来,不会递归读取。

 func (*File) Readdir 

	fileInfo,err := fileSd.Readdir(-1)
	for _,v := range fileInfo{
		fmt.Println(v.Name())
	}

判断文件是否存在


在进行文件操作的时候,有时候会有这样一个功能,判断文件是否存在,这个在项目里面会经常使用。

判断文件是否存在

golang判断文件或文件夹是否存在的方法为使用os.Stat()函数返回的错误值进行判断

  1. 如果返回的错误为nil,说明文件或文件夹存在
  2. 如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或文件夹不存在
  3. 如果返回的错误为其它类型,则不确定是否在存在

func Stat 

func Stat(name string) (FileInfo, error)

这个可以自己定义一个函数,输入路径来判断目录或者文件是否存在。(传入文件路径,根据布尔值来判断文件是否存在,true为文件/文件夹存在,反之)

func PathExits(path string) (bool,error) {
	_,err := os.Stat(path)

	if err == nil{  //文件或者目录存在
		return true,nil
	}

	if os.IsNotExist(err) {  //判断错误类型是不是不存在类型错误
		return false,nil
	}

	return false,err   //有错误,但是不是上面的错误类型,那么就将错误原封不动的返回
}

总结


文件

  • 创建:os.Create
  • 读取:os.0pen 
  • 获取属性:os.0pen().Stat/os.Stat
  • 修改属性:权限,所属人
  • 重命名:os.Rename("test1.txt","test2.txt")  //不仅仅可以重命名,还可以将文件移动到某些目录下面 os.Rename("test/file1","a/b/c/file2")
  • 删除文件:os.Remove("test1.txt")

没有复制的功能! 

目录

  • 创建:os.Mkdir("a",os.ModePerm)  os.MkdirAll("a/b/c",os.ModePerm)
  • 读取:os.0pen
  • 获取属性:os.0pen().Stat/ os.Stat
  • 修改属性:权限,所属人os.Chmod() os.Chown()
  • 重命名:os.Rename
  • 删除文件夹:os.Remove  os.RemoveAll  

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/123629357
今日推荐