目录
1、接口
1.1 打开/关闭文件
os.Create(文件名):创建并打开文件,如果已经存在则清空,默认RDWR,0666;
os.Open(文件名):以只读权限打开一个文件;
os.OpenFile(文件名,读写权限,文件权限):如果文件存在则打开,否则创建新文件
读写权限
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.
)
文件权限
// The defined file mode bits are the most significant bits of the FileMode.
// The nine least-significant bits are the standard Unix rwxrwxrwx permissions.
// The values of these bits should be considered part of the public API and
// may be used in wire protocols or disk representations: they must not be
// changed, although new bits might be added.
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 (not backed up)
ModeSymlink // L: symbolic link
ModeDevice // D: device file
ModeNamedPipe // p: named pipe (FIFO)
ModeSocket // S: Unix domain socket
ModeSetuid // u: setuid
ModeSetgid // g: setgid
ModeCharDevice // c: Unix character device, when ModeDevice is set
ModeSticky // t: sticky
// Mask for the type bits. For regular files, none will be set.
ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice
ModePerm FileMode = 0777 // Unix permission bits
)
关闭文件
f.Close() //File*f为os.Create或os.Open或os.OpenFile的返回值
1.2 文件同步
f.Sync() //os.File *f
w.Flush() //bufio.Writer* w
1.3 重定位
f.seek(offset, whence) //osFile *f
SEEK_SET=0:文件开头
SEEK_CUR=1:当前位置
SEEK_END=2:文件末尾
// Seek whence values.
const (
SEEK_SET int = 0 // seek relative to the origin of the file
SEEK_CUR int = 1 // seek relative to the current offset
SEEK_END int = 2 // seek relative to the end
)
1.4 创建目录
os.Mkdir(目录名,模式)
os.MkdirAll(目录名,模式) //中间目录如果不存在也会创建
比如:
dname := "/home/stack/tmp/d"
os.Mkdir(dname, os.ModeDir|os.ModePerm)
os.MkdirAll(dname, os.ModeDir|os.ModePerm) //中间目录如果不存在也会创建
1.5 删除文件/目录
os.Remove(fname)
2、读操作示例
package main
import (
"bufio"
"fmt"
"io"
"io/ioutil"
"os"
"strings"
)
var fl = fmt.Println
var ff = fmt.Printf
func main() {
//读文件
f, err := os.Open("aaa")
if err != nil {
ff("open file failed, err %v\n", err)
return
}
defer f.Close()
//方法1:按行读
fl("Read one line once way 1")
input := bufio.NewScanner(f)
for input.Scan() {
fl(input.Text()) //自动去掉换行符
}
//方法2:按行读
fl("Read one line once way 2")
f.Seek(0, os.SEEK_SET)
rd := bufio.NewReader(f)
for {
line, err := rd.ReadString('\n') //不会去掉换行符
if err != nil {
if err != io.EOF {
panic(err)
} else {
fl("Read end")
break
}
}
line = strings.Trim(line, "\n")
fl(line)
}
//方法3:按字节读
fl("Read 4 byte once. WAY 1")
f.Seek(0, os.SEEK_SET)
rd = bufio.NewReader(f)
buf := make([]byte, 4)
for {
n, err := rd.Read(buf)
if err != nil {
if err != io.EOF {
panic(err)
} else {
fl("Read end")
break
}
}
fl(string(buf[:n]))
}
//方法4:按字节读
fl("Read 4 byte once. WAY 2")
f.Seek(0, os.SEEK_SET)
buf = make([]byte, 4)
for {
n, err := f.Read(buf)
if err != nil {
if err != io.EOF {
panic(err)
} else {
fl("Read end")
break
}
}
fl(string(buf[:n]))
}
//方法5:一次全部读入
fl("Read all once")
f.Seek(0, os.SEEK_SET)
buf2, err := ioutil.ReadAll(f)
if err != nil && err != io.EOF {
panic(err)
}
if len(buf2) <= 0 {
fl("Read null data")
}
fl(string(buf2))
}
3、写操作示例
package main
import (
"bufio"
"fmt"
"io"
"io/ioutil"
"os"
)
var fl = fmt.Println
func main() {
var n int
//f, err := os.Create("./create") //以读写方式打开,如果存在则清空
f, err := os.OpenFile("./bbb", os.O_CREATE|os.O_RDWR, 0666) //与create效果一样
//f, err := os.OpenFile("./aaa", os.O_CREATE|os.O_RDWR|os.O_APPEND, os.ModeAppend|os.ModePerm) //追加写,带可执行权限
if err != nil {
panic(err)
}
defer f.Close()
//方法1
n, err = f.WriteString("abc")
if err != nil {
panic(err)
}
fl(n)
var buf = []byte("efg")
n, err = f.Write(buf)
if err != nil {
panic(err)
}
fl(n)
f.Sync()
//方法2
w := bufio.NewWriter(f)
n, err = w.WriteString("hij")
if err != nil {
panic(err)
}
fl(n)
n, err = w.Write([]byte("lmn"))
if err != nil {
panic(err)
}
fl(n)
w.Flush()
//方法3
n, err = io.WriteString(f, "opq")
if err != nil {
panic(err)
}
fl(n)
//方法4
err = ioutil.WriteFile("./ccc", buf, 0666)
if err != nil {
panic(err)
}
}