go语言文件操作示例

目录

1、接口

1.1 打开/关闭文件

1.2 文件同步

1.3 重定位

1.4 创建目录

1.5 删除文件/目录

2、读操作示例

3、写操作示例


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)
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值