Golang08-go语言I/O操作

696 阅读4分钟

Go语言文件i/o操作

  1. 掌握文件的常规操作
  2. 掌握ioutil的使用
  3. 掌握bufio包的使用

I/O,也就是Input/Output,也可以理解为读写操作。

1.1文件的定义

所谓的文件,是指一组相关数据的有序几何。文件通常时驻留在外部介质(如磁盘)上的,在使用的时候才调用至内存。

一个文件要有:1、文件路径。2、文件名和后缀名。

1.2 FileInfo接口

文件的信息包括文件名,文件大小,修改权限,修改时间等

Go语言FileInfo接口如下

type FileInfo interface {
	name() string
	size() int64
	mode() os.FileMode
	modTime() time.Time
	isDir() bool
	sys() interface{}
}

文件路径分为绝对路径和相对路径。

绝对路径:D:/go/goDemo/thisGo.go
相对路径:.../goDemo/thisGo.go

打印输出文件信息

package main

import (
	"fmt"
	"os"
)

func printMes(path string)  {
	fileInfo,err:=os.Stat(path)
	if err!=nil{
		fmt.Println("err",err.Error())
	}else{
		fmt.Printf("数据类型时:%T\n",fileInfo)
		fmt.Println("文件名:",fileInfo.Name())
		fmt.Println("是否为目录:",fileInfo.IsDir())
		fmt.Println("文件大小:",fileInfo.Size())
		fmt.Println("文件权限:",fileInfo.Mode())
		fmt.Println("文件最后修改的日期:",fileInfo.ModTime())
	}
}

func main()  {
	//绝对路径
	path:="D:/c/test.txt"
	printMes(path)
}
/*
输出结果:
文件名: test.txt
是否为目录: false
文件大小: 0
文件权限: -rw-rw-rw-
文件最后修改的日期: 2021-07-16 10:43:08.9098702 +0800 CST
*/

文件权限打印出来一共10个字符。文件有3种基本权限:r(read,读)、w(write,写)、x(execute,执行权限)

1.3文件路径

与文件路径相关的方法

package main

import (
	"fmt"
	"path"
	"path/filepath"
)

func main()  {
	//绝对路径
	filePath:="D:/c/test.txt"
	//相对路径
	fmt.Println(filepath.IsAbs(filePath))		//判断是否为绝对路径
	fmt.Println(filepath.Rel("D:/c/test.txt",filePath))	//获取相对路径
	fmt.Println(path.Join(filePath,".."))
	fmt.Println(path.Join("D:/c/test.txt",filePath))	//拼接相对路径
}
/*
true
. <nil>
D:/c
D:/c/test.txt/D:/c/test.txt
*/

1.4文件常规操作

创建目录,如果路径存在则创建失败

1、os.MKdirAll()

2、os.MKdirAll()

package main

import (
	"fmt"
	"os"
)

func main()  {
	fileP:="D:/c/"
	//创建目录
	err:=os.Mkdir(fileP,os.ModePerm)
	if err!=nil{
		fmt.Println("err:",err.Error())
	}else{
		fmt.Println("文件创建成功")
	}

	fileP="D:/c/c"
	//创建目录
	err=os.Mkdir(fileP,os.ModePerm)
	if err!=nil{
		fmt.Println("err:",err.Error())
	}else{
		fmt.Println("文件创建成功")
	}

	fileP2:="D:/test/abc/xy"
	err=os.MkdirAll(fileP2,os.ModePerm)
	if err!=nil{
		fmt.Println("err",err.Error())
	}else{
		fmt.Println(fileP2,"文档创建成功")
	}
}
/*
输出结果:
err: mkdir D:/c/: Cannot create a file when that file already exists.
文件创建成功
D:/test/abc/xy 文档创建成功
*/

1.5 创建文件

os.Create(fileName) // fileName是文件的路径以及文件名

package main

import (
	"fmt"
	"os"
)
func main()  {
	fileName:="./bcd.txt"	//创建文件的相对路径
	//创建文件
	file1,err:=os.Create(fileName)
	if err!=nil{
		fmt.Println("err:",err.Error())
	}else{
		fmt.Printf("%s 创建成功 %v\n",fileName,file1)
	}
}

1.6 打开和关闭文件

  1. fileName文件名称
  2. mode,文件的打开方式
  3. perm,文件的权限。文件不存在时创建文件,需要指定权限。
package main

import (
	"fmt"
	"os"
)

func main()  {
	fileName:="./abc.txt"
	file2,err:=os.Open(fileName)
	if err!=nil{
		fmt.Println("err",err.Error())
	}else{
		fmt.Printf("%s打开成功!%v\n",fileName,file2)
	}
	fileName1:="./rgb.txt"
	//如果以读写的方式打开,文件不存在则自动创建新文件
	file4,err:=os.OpenFile(fileName1,os.O_RDWR|os.O_CREATE,os.ModePerm)
	if err!=nil{
		fmt.Println("err:",err.Error())
	}else{
		fmt.Printf("%s打开成功!%v\n",fileName1,file4)
	}
	file2.Close()
	file4.Close()
}

//创建了一个rgb.txt的文件
/*
./abc.txt打开成功!&{0xc000100780}
./rgb.txt打开成功!&{0xc000100a00}
*/

1.7 删除文件

删除文件有两种方法:

package main

import (
	"fmt"
	"os"
)

func main()  {
	fileName:="./bcd"
	err:=os.Remove(fileName)
	if err!=nil{
		fmt.Println(err)
	}else{
		fmt.Printf("%s 删除成功!\n",fileName)
	}

	ero:=os.RemoveAll(fileName)		//移除它的路径和所有的子节点
	fmt.Println(ero)
	if ero!=nil{
		fmt.Println(ero)
	}else{
		fmt.Printf("%s 删除成功!!",fileName)
	}
}
/*
remove ./bcd: The system cannot find the file specified.
<nil>
./bcd 删除成功!!
*/

可以看出,通过os.Remove()方法删除非空目录会失败

1.8读写文件以及复制文件

package main

import (
	"fmt"
	"io"
	"os"
)

func main()  {
	filePath:="./abc.txt"
	file,err:=os.Open(filePath)
	if err!=nil{
		fmt.Println("打开文件错误!",err)
	}else{
		bs:=make([]byte,1024*8,1028*8)
		n:=-1
		for{
			n,err=file.Read(bs)
			if n==0||err==io.EOF{
				fmt.Println("读取文件结束")
				break
			}
			fmt.Println(string(bs[:n]))
		}
	}
	file.Close()
}

/*
123456897

1213455478
读取文件结束
*/

1.9写入文件

写入文件的步骤:

  1. 打开或者创建文件
  2. 写入文件
  3. 关闭文件
  4. **file.Close()**
package main

import (
	"fmt"
	"os"
)

func main()  {
	file,err:=os.OpenFile("./abc.txt",os.O_RDWR|os.O_CREATE,os.ModePerm)

	defer file.Close()
	if err!=nil{
		fmt.Println("打开文件异常",err.Error())
	}else{
		n,err:=file.Write([] byte("this is A B C D"))
		if err!=nil{
			fmt.Println("写入程序异常!",err.Error())
		}else{
			fmt.Println("写入OK!",n)
		}
	}
	n,err:=file.WriteString("中国话!")
	if err!=nil{
		fmt.Println("写入文件异常:",err.Error())
	}else {
		fmt.Println("写入OK:",n)
	}
}
/*
*/

这样写入会删除文件内部的信息

1.10复制文件

Go语言提供copyFile()方法来复制文件。

package main

import (
	"fmt"
	"io"
	"os"
)
func copyFile(srcFile,destFile string)(int64,error)  {
	file1,err:=os.Open(srcFile)
	if err!=nil{
		return 0,err
	}
	file2,err:=os.OpenFile(destFile,os.O_RDWR|os.O_CREATE,os.ModePerm)

	if err!=nil{
		return 0,err
	}
	defer file1.Close()
	defer file2.Close()
	return io.Copy(file2,file1)
}

func main()  {
	//源文件相对路径
	srcFile:="./abc.txt"
	//准备生成
	destFile:="./xxx.txt"
	total,err:=copyFile(srcFile,destFile)
	if err!=nil{
		fmt.Println(err.Error())
	}else{
		fmt.Println("复制完成!",total)
	}
}
/*

复制完成! 27
*/