2021-07-07 13:37:39 +08:00
|
|
|
|
# Golang 文件操作
|
2020-10-13 14:08:29 +08:00
|
|
|
|
|
2020-11-23 17:52:38 +08:00
|
|
|
|
os.File 封装了所有文件相关的操作,File 是一个结构体,有很多方法。
|
2020-10-13 14:08:29 +08:00
|
|
|
|
|
2020-11-23 17:52:38 +08:00
|
|
|
|
## 1.os 包
|
|
|
|
|
|
|
|
|
|
### 1.1.创建文件
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
func Create(name string) (file *File, err error)
|
|
|
|
|
func NewFile(fd uintptr, name string) *File
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Create 方法示例如下:
|
2020-10-13 14:08:29 +08:00
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
f,err := os.Create(fileName)
|
|
|
|
|
defer f.Close()
|
|
|
|
|
if err !=nil {
|
|
|
|
|
fmt.Println(err.Error())
|
|
|
|
|
} else {
|
|
|
|
|
_,err=f.Write([]byte("要写入的文本内容"))
|
|
|
|
|
checkErr(err)
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2020-11-23 17:52:38 +08:00
|
|
|
|
### 1.2.打开文件
|
2020-10-13 14:08:29 +08:00
|
|
|
|
|
|
|
|
|
```go
|
2020-11-23 17:52:38 +08:00
|
|
|
|
func Open(name string) (*File, error)
|
|
|
|
|
func OpenFile(name string, flag int, perm FileMode) (*File, error)
|
2020-10-13 14:08:29 +08:00
|
|
|
|
```
|
|
|
|
|
|
2021-07-17 11:32:46 +08:00
|
|
|
|
flag 如下:
|
2020-10-13 14:08:29 +08:00
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
//打开方式
|
|
|
|
|
const (
|
|
|
|
|
//只读模式
|
|
|
|
|
O_RDONLY int = syscall.O_RDONLY // open the file read-only.
|
|
|
|
|
//只写模式
|
|
|
|
|
O_WRONLY int = syscall.O_WRONLY // open the file write-only.
|
|
|
|
|
//可读可写
|
|
|
|
|
O_RDWR int = syscall.O_RDWR // open the file read-write.
|
|
|
|
|
//追加内容
|
|
|
|
|
O_APPEND int = syscall.O_APPEND // append data to the file when writing.
|
|
|
|
|
//创建文件,如果文件不存在
|
|
|
|
|
O_CREATE int = syscall.O_CREAT // create a new file if none exists.
|
|
|
|
|
//与创建文件一同使用,文件必须存在
|
|
|
|
|
O_EXCL int = syscall.O_EXCL // used with O_CREATE, file must not exist
|
|
|
|
|
//打开一个同步的文件流
|
|
|
|
|
O_SYNC int = syscall.O_SYNC // open for synchronous I/O.
|
|
|
|
|
//如果可能,打开时缩短文件
|
|
|
|
|
O_TRUNC int = syscall.O_TRUNC // if possible, truncate file when opened.
|
|
|
|
|
)
|
|
|
|
|
```
|
2020-11-23 17:52:38 +08:00
|
|
|
|
|
2021-07-17 11:32:46 +08:00
|
|
|
|
perm 模式如下:
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
const (
|
|
|
|
|
// The single letters are the abbreviations
|
|
|
|
|
// used by the String method's formatting.
|
|
|
|
|
// 文件夹模式
|
|
|
|
|
ModeDir FileMode = 1 << (32 - 1 - iota) // d: is a directory
|
|
|
|
|
// 追加模式
|
|
|
|
|
ModeAppend // a: append-only
|
|
|
|
|
// 单独使用
|
|
|
|
|
ModeExclusive // l: exclusive use
|
|
|
|
|
// 临时文件
|
|
|
|
|
ModeTemporary // T: temporary file; Plan 9 only
|
|
|
|
|
// 象征性的关联
|
|
|
|
|
ModeSymlink // L: symbolic link
|
|
|
|
|
// 设备文件
|
|
|
|
|
ModeDevice // D: device file
|
|
|
|
|
// 命名管道
|
|
|
|
|
ModeNamedPipe // p: named pipe (FIFO)
|
|
|
|
|
// Unix 主机 socket
|
|
|
|
|
ModeSocket // S: Unix domain socket
|
|
|
|
|
// 设置uid
|
|
|
|
|
ModeSetuid // u: setuid
|
|
|
|
|
// 设置gid
|
|
|
|
|
ModeSetgid // g: setgid
|
|
|
|
|
// UNIX 字符串设备,当设备模式是设置unix
|
|
|
|
|
ModeCharDevice // c: Unix character device, when ModeDevice is set
|
|
|
|
|
// 粘性的
|
|
|
|
|
ModeSticky // t: sticky
|
|
|
|
|
// 非常规文件;对该文件一无所知
|
|
|
|
|
ModeIrregular // ?: non-regular file; nothing else is known about this file
|
|
|
|
|
|
|
|
|
|
// bit位遮盖,不变的文件设置为none
|
|
|
|
|
// Mask for the type bits. For regular files, none will be set.
|
|
|
|
|
ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice | ModeCharDevice | ModeIrregular
|
|
|
|
|
// 权限位
|
|
|
|
|
ModePerm FileMode = 0777 // Unix permission bits
|
|
|
|
|
)
|
|
|
|
|
```
|
|
|
|
|
|
2020-11-23 17:52:38 +08:00
|
|
|
|
### 1.3.获取文件状态
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
func (f *File) Stat() (fi FileInfo, err error)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 1.4.读取文件
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
func (f *File) Read(b []byte) (n int, err error)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 1.5.写入文件
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
func (f *File) Write(b []byte) (n int, err error)
|
|
|
|
|
```
|
|
|
|
|
|
2021-03-11 11:11:13 +08:00
|
|
|
|
### 1.6.设置读写位置
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
/**
|
|
|
|
|
* @param whence
|
|
|
|
|
* os.SEEK_SET: seek relative to the origin of the file
|
|
|
|
|
* os.SEEK_CUR: seek relative to the current offset
|
|
|
|
|
* os.SEEK_END: seek relative to the end
|
|
|
|
|
*/
|
|
|
|
|
func (f *File) Seek(offset int64, whence int) (ret int64, err error)
|
|
|
|
|
```
|
|
|
|
|
|
2020-11-23 17:52:38 +08:00
|
|
|
|
## 2.ioutil 包
|
|
|
|
|
|
|
|
|
|
### 2.1.读取
|
|
|
|
|
|
|
|
|
|
示例如下:
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import(
|
|
|
|
|
"io/ioutil"
|
|
|
|
|
"fmt"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func main(){
|
|
|
|
|
b,err := ioutil.ReadFile("C:/example.txt")
|
|
|
|
|
|
|
|
|
|
if err != nil{
|
|
|
|
|
fmt.Println(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fmt.Println(b)
|
|
|
|
|
fmt.Println(string(b))
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 2.2.写入
|
|
|
|
|
|
|
|
|
|
示例如下:
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import(
|
|
|
|
|
"io/ioutil"
|
|
|
|
|
"fmt"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func main(){
|
|
|
|
|
str := []byte("Hello,Go!")
|
|
|
|
|
err := ioutil.WriteFile("C:/example.txt", str, 0644)
|
|
|
|
|
if err != nil{
|
|
|
|
|
panic(err)
|
|
|
|
|
}else{
|
|
|
|
|
fmt.Println("WriteFile Success!")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 3.bufio 包
|
|
|
|
|
|
|
|
|
|
### 3.1.读文件
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
func NewReader(rd io.Reader) *Reader
|
|
|
|
|
func (b *Reader) Read(p []byte) (n int, err error)
|
|
|
|
|
func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 3.2.写文件
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
func NewWriter(w io.Writer) *Writer
|
|
|
|
|
func (b *Writer) Write(p []byte) (nn int, err error)
|
|
|
|
|
```
|