os 包提供了对文件、系统和进程的操作函数
一、文件操作
1.1 常用常量
Stdin
Stdout
Stderr
-
1.2 常用函数
Chmod
:修改文件权限Chown
:修改文件所属用户,用户组Chtimes
:修改文件访问时间和修改时间IsExist
:与os.Stat
一起用于判断文件存在IsNotExist
:与os.Stat
一起用于判断文件不存在Link
:创建软链接Mkdir
:创建文件夹MkdirAll
:创建文件夹(父目录不存在逐层创建)Remove
:移除文件或空文件夹RemoveAll
:移除所有文件-
1.3 常用结构体
-
1.3.1 常用函数
Create
:创建文件并返回文件对象指针(文件不存在则创建,文件存在则清空)Open
:打开文件并返回文件对象指针-
1.3.2 常用方法
Read
:读取文件到字节切片Write
:写入字节切片到文件WriteString
:写入字符串到文件Readdir
:获取目录下所有文件信息Readdirnames
:获取目录下所有文件名Seek
:设置文件指针位置Stat
:获取文件状态信息Sync
:同步文件到硬盘-
二、方法使用
2.1 读取一个文件(不带缓冲的IO读取)
func main() {
path := "text.txt"
f, err := os.Open(path)
if err != nil {
fmt.Println(err)
return
}
content := make([]byte, 1024)
for {
n, err := f.Read(content)
if err != nil {
if err != io.EOF {
fmt.Println(err)
}
break
}
fmt.Println(string(content[:n]))
}
f.Close()
}
2.2 创建文件
os.Create
写文件,文件存在截断(清空),文件不存在创建os.open
读取文件,文件不存在报错func main() {
path := "text.txt"
f, err := os.Create(path)
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
f.Write([]byte("123456\n"))
f.Write([]byte("休息休息\n"))
f.WriteString("我是大冬")
}
2.3 标准输入输出
标准输入 => 命令行的文件
os.Stdin
标准输出 => 命令行的文件os.Stdout
标准错误输出 => 命令行的文件os.Stderr
func main() {
content := make([]byte, 3)
fmt.Print("请输入内容:")
os.Stdin.Read(content)
fmt.Println(string(content))
fmt.Printf("%q\n", string(content))
os.Stdout.WriteString("我是Stdout输出")
//fmt.Scan
//fmt.Sscan => 从字符串扫描到变量
//fmt.Fscan => 从文件扫描到变量
}
2.3.1 openfile
func OpenFile(name string, flag int, perm FileMode) (*File, error)
name
代表文件的路径flag
代表打开的方式O_RDONLY
以只读方式打开O_WRONLY
以只写方式打开O_RDWR
以读写方式打开O_APPEND
追加O_CREATE
文件不存在时创建O_EXCL
文件必须不存在O_SYNC
使用同步IOO_TRUNC
截断文件
perm
文件的权限# 日志文件存在追加方式
func main() {
f, err := os.OpenFile("test.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0777)
if err != nil {
return
}
defer f.Close()
fmt.Fprintf(f,"%s\n",time.Now().Format("2006-01-02 15:04:05"))
}
2.4 创建带有缓冲的buf
2.4.1 带有缓冲的读取
f, err := os.Open("text.txt")
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
reader := bufio.NewReader(f)
// 每行进行读取
fmt.Println(reader.ReadLine())
2.4.2 带有缓冲的写入
```go func main() { f, err := os.Create(“text.txt”) if err != nil {
} defer f.Close() writer := bufio.NewWriter(f) writer.WriteString(“hello 大冬\n”) writer.Flush() }return
<a name="DXgzd"></a>
# 三、文件的操作

- 文件
- 创建 => `os.Create`
- 读取 => `os.Open`
- 获取属性 => `os.Open().Stat` / `os.Stat`
- 修改属性 => 权限,所属人
- `os.Chmod()` 修改权限
- `os.Chown()` 修改所属人
- 重命名
- `os.Rename()`
- 删除文件
- `os.Remove()`
- 目录
- 创建
- `os.Mkdir("a",os.ModePerm)`
- `os.MkdirAll("a/b/c",os.ModePerm)`
- 读取
- `os.Open`
- 获取属性
- `os.Open().Stat`
- `os.Stat`
- 修改属性
- `os.Chmod()` 修改权限
- `os.Chown()` 修改所属人
- 重命名文件夹(移动)
- `os.Rename()`
- 删除文件夹
- `os.Remove()`
- `os.RemoveAll()`
<a name="EZB0H"></a>
# 四、ioutil包
<a name="QfW15"></a>
## 4.1 读取
`ioutil.ReadAll()` 读取所有open打开的内容<br />`ioutil.ReadFile()` 直接读取文件,不需要先open<br />`ioutil.ReadDir()` 读取目录所有文件
<a name="VmNjW"></a>
## 4.2 写入
`ioutil.WriteFile()` 直接写入文件 => `ioutil.WriteFile("text.txt", []byte("123456"), os.ModePerm)`
<a name="VRetW"></a>
# 五、Path
<a name="Wr05H"></a>
## 5.1 filepath
获取:
- `filepath.Abs()` 获取文件的绝对路径
- `filepath.Base()` 获取文件的名称
- `filepath.Dir()` 获取文件的父目录
- `filepath.Ext()` 获取文件后缀
- `filepath.Glob("dir/*/*.go")` 获取dir目录里面所有子目录里的`*.go`文件
- `filepath.Walk` 获取所有子目录文件(递归)
分割和连接:
- `filepath.Split()` 分割文件的父目录和文件名称
- `filepath.SplitList("a;b;c")` 通过`;`分号进行分割
- `filepath.Join("d:\\a","b/c/d")` 连接路径
判断:
- `filepath.HasPrefix("main.go","D:\\a")` 判断是否在路径下
- `filepath.IsAbs()` 判断是否是绝对路径
`filepath.Walk`示例:
```go
filepath.Walk("testdir", func(path string, info fs.FileInfo, err error) error {
fmt.Println(path,info.Name())
return nil
})
六、文件格式
6.1 gob文件编解码
编码一段gob文件
type User struct {
Id int
Name string
}
func main() {
users := []User{
{1, "dadong"},
{2, "dd"},
{3, "xxd"},
}
gob.Register(User{})
file, err := os.Create("dd.gob")
if err != nil {
return
}
defer file.Close()
encoder := gob.NewEncoder(file)
encoder.Encode(users)
}
解码
type User struct {
Id int
Name string
}
func main() {
gob.Register(User{})
file,err:=os.Open("dd.gob")
if err != nil {
return
}
defer file.Close()
decoder := gob.NewDecoder(file)
var users []User
fmt.Println(decoder.Decode(&users))
fmt.Println(users)
}