Go语言文件i/o操作
- 掌握文件的常规操作
- 掌握ioutil的使用
- 掌握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 打开和关闭文件
- fileName文件名称
- mode,文件的打开方式
- 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写入文件
写入文件的步骤:
- 打开或者创建文件
- 写入文件
- 关闭文件 **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
*/