Go语言学习之 Day06
文件操作
- 读文件:Open:打开文件并返回文件对象指针
- 写文件:Create:创建文件并返回文件对象指针(文件不存在则创建,文件存在则清空)
- 追加文件:OpenFile:按指定权限打开文件,并返回文件指针对象
Mode:获取文件模式
Flag:获取日志开头
- 文件位置:Seek:设置文件指针位置
- 删除文件:Remove:移除文件或空文件夹
- RemoveAll:移除所有文件
- 重命名:Rename
标准流
os包提供了对文件、系统和进程的操作函数
文件操作
- 常用常量:
Stdin
Stdout
Stderr
ModePerm:0777
- 常用函数:
Chmod:修改文件权限
Chown:修改文件所属用户,用户组
Chtimes:修改文件访问时间和修改时间
IsExist:与os.Stat一起用于判断文件存在
IsNotExist:与os.Stat一起用于判断文件不存在
Link:创建软链接
Mkdir:创建文件夹
MkdirAll:创建文件夹(父目录不存在逐层创建)
文件格式
带缓冲IO -bufio
bufio包提供缓冲流的功能
a)常用结构体
Reader
常用函数
- NewReader:创建缓冲输入流
常用方法 - Read:读取数据到切片中
- ReadLine:读取一行内容到字节切片中
- ReadSlice:根据分隔符读取数据到字节切片
- ReadString:根据分隔符读取数据到字符串
- Reset:重设缓冲流
- WriteTo:将数据写入到输出流
Writer
常用函数
- NewWriter:创建缓冲输出流
常用方法 - Write:将字节切片内容写入
- WriteString:将字符串写入
- Reset:重置输出流
- Flush: 刷新数据到输出流
Scanner
常用函数
- NewScanner:创建扫描对象
常用方法 - Scan:扫描数据
- Split:定义流分割函数,默认空格
- Text:读取数据
- Err:获取错误
目录操作
常用包
File:对文件操作
常用方法:
- Read:读取文件到字节切片
- Write:写入字节切片到文件
- WriteString:写入字符串到文件
- Readdir:获取目录下所有文件信息
- Readdirnames:获取目录下所有文件名
- Seek:设置文件指针位置
- Stat:获取文件状态信息
- Sync:同步文件到硬盘
- Close:关闭文件
文件格式-csv
encoding/csv包提供对csv文件读写的操作
常用结构体
Reader
常用函数
NewReader
常用方法
Read
ReadAll
Writer
常用函数
NewWriter
常用方法
Write
WriteAll
Flush
package day06
import (
"encoding/csv"
"os"
"testing"
)
func TestCsv(t *testing.T) {
file, _ := os.Open("table.csv")
defer file.Close()
reader := csv.NewReader(file)
line, err := reader.Read()
t.Log(err, line)
line, err = reader.Read()
t.Log(err, line)
line, err = reader.Read()
t.Log(err, line)
line, err = reader.Read()
t.Log(err, line)
file, _ = os.Create("table.csv")
writer := csv.NewWriter(file)
writer.Write([]string{"A1", "B1", "C1"})
writer.Write([]string{"A2", "B2", "C2"})
writer.Write([]string{"A3", "B3", "C3"})
writer.Write([]string{"A4", "B4", "C4"})
writer.Flush()
}
常用包-os
FileInfo:文件状态信息
常用函数:
Lstat:获取文件路径文件信息(对于链接返回连接文件信息)
Stat:获取文件路径文件信息(对于链接返回连接到的文件的信息)
常用方法:
Name:获取文件名
Size:获取文件大小
Mode:获取文件模式
ModTime:获取修改时间
IsDir:判断是否为文件夹
点击查看代码
func TestFileInfo(t *testing.T) {
path := "mgr1"
file, err := os.Stat(path) // os.Lstat =>连接 =>连接文件 Stat => 原文件
if err != nil {
t.Log(err) //CreateFile mgr1: The system cannot find the file specified.
if os.IsNotExist(err) {
t.Log("文件不存在")
return
}
log.Fatal(err)
}
t.Log(file.IsDir())
}
常用包-path/filepath
filepath 包提供对文件路径的操作,兼容不同操作系统
常用函数
Abs:绝对路径
Base:文件名
Clean:清除文件路径中.、..等字符
Dir:文件文件目录
Ext:获取文件后缀
FromSlash:格式化路径分割符(\)
ToSlash:格式化路径分割符(/)
Glob:获取匹配格式的文件路径切片
IsAbs:判断是否为绝对路径
Join:连接路径
Match:判断路径是否匹配格式
Split:分割文件目录和文件名
SplitList:分割路径分割符(冒号或分号)连接的文件路径
Walk:遍历目录中文件(子孙)
点击查看代码
package day06
import (
"io/fs"
"os"
"path/filepath"
"testing"
)
func TestFilePath(t *testing.T) {
t.Log(filepath.Abs("."))
path := "C:\\Users\\wenyu\\GolandProjects"
t.Log(filepath.Dir(path), filepath.Base(path), filepath.Ext(path))
t.Log(filepath.IsAbs("."), filepath.IsAbs(path), filepath.IsAbs("C:\\"))
t.Log(filepath.Clean("C:\\Users\\wenyu\\GolandProjects\\mage\\..\\day06")) // C:\Users\wenyu\GolandProjects\day06
t.Log(filepath.Clean("/root/a/../kk.txt"))
// 路径转换
t.Log(filepath.FromSlash("/root/a/..\\kk.txt"), filepath.ToSlash("/root/a/..\\kk.txt"))
// 转成斜杠
t.Log(filepath.ToSlash(filepath.Join("/root/kk", "a", "b", "kk.txt")))
t.Log(filepath.Split(path))
t.Log(filepath.SplitList(os.Getenv("PATH")))
// /root/所有的.go文件 /root/*.go
// glob
// * 匹配任意多个
// ? 匹配一个
// (f1|f2|f3)
t.Log(filepath.Glob("./*.go"))
t.Log(filepath.Glob("./*.txt"))
t.Log(filepath.Glob("../*/*.go"))
t.Log(filepath.Match("./*.txt", "./fprint.txt"))
t.Log(filepath.Match("./*.txt", "./atxt"))
// 遍历当前目录 或者 指定目录下面的内容
filepath.Walk(".", func(path string, fileInfo fs.FileInfo, err error) error {
t.Log(path, fileInfo.IsDir(), fileInfo.Name())
return nil
})
}