Golang笔记

使用Golang 对文件增删写读操作备忘

使用Golang 的底层库 ioos 对文件常规操作:新建、写入、读取、删除。另外内置的 ioutil 使用也很方便。

package main

import (
	"fmt"
	"io"
	"os"
)

var path = "/Users/novalagung/Documents/temp/test.txt"

func main() {
	createFile()
	writeFile()
	readFile()
	deleteFile()
}

func createFile() {
	// detect if file exists
	var _, err = os.Stat(path)

	// create file if not exists
	if os.IsNotExist(err) {
		var file, err = os.Create(path)
		if isError(err) { return }
		defer file.Close()
	}

	fmt.Println("==> done creating file", path)
}

func writeFile() {
	// open file using READ & WRITE permission
	var file, err = os.OpenFile(path, os.O_RDWR, 0644)
	if isError(err) { return }
	defer file.Close()

	// write some text line-by-line to file
	_, err = file.WriteString("halo\n")
	if isError(err) { return }
	_, err = file.WriteString("mari belajar golang\n")
	if isError(err) { return }

	// save changes
	err = file.Sync()
	if isError(err) { return }

	fmt.Println("==> done writing to file")
}

func readFile() {
	// re-open file
	var file, err = os.OpenFile(path, os.O_RDWR, 0644)
	if isError(err) { return }
	defer file.Close()

	// read file, line by line
	var text = make([]byte, 1024)
	for {
		_, err = file.Read(text)
		
		// break if finally arrived at end of file
		if err == io.EOF {
			break
		}
		
		// break if error occured
		if err != nil && err != io.EOF {
			isError(err)
			break
		}
	}
	
	fmt.Println("==> done reading from file")
	fmt.Println(string(text))
}

func deleteFile() {
	// delete file
	var err = os.Remove(path)
	if isError(err) { return }

	fmt.Println("==> done deleting file")
}

func isError(err error) bool {
	if err != nil {
		fmt.Println(err.Error())
	}

	return (err != nil)
}

使用 ioutil

ioutil 包实现了一些 I/O 实用函数。

func NopCloser(r io.Reader) io.ReadCloser
返回一个包裹起给定 Reader r 的 ReadCloser , 这个 ReadCloser 带有一个无参数的 Close 方法。

func ReadAll(r io.Reader) ([]byte, error) 
对 r 进行读取, 直到发生错误或者遇到 EOF 为止, 然后返回被读取的数据。

func ReadDir(dirname string) ([]os.FileInfo, error)
读取 dirname 指定的目录, 并返回一个根据文件名进行排序的目录节点列表

func ReadFile(filename string) ([]byte, error)
读取名字为 filename 的文件并返回文件中的内容。

func TempDir(dir, pattern string) (name string, err error)
在目录 dir 中新创建一个带有指定前缀 prefix 的临时目录, 然后返回该目录的路径。 

func TempFile(dir, pattern string) (f *os.File, err error)
在目录 dir 新创建一个名字带有指定前缀 prefix 的临时文件, 以可读写的方式打开它, 并返回一个 *os.File 指针。

func WriteFile(filename string, data []byte, perm os.FileMode) error
将给定的数据 data 写入到名字为 filename 的文件里面。

一般情况下,ioutil库读取文件的效率最高,bufio库次之,直接使用文件的Read加上buffer的方法效率最低。但对于大文件,设置相同大小的buffer有时bufio反而会更慢。

本文网址: https://golangnote.com/topic/269.html (转载注明出处)
关于GolangNote:记录在工作中使用golang 遇到、面临的相关问题及解决方法。如果你在这里获得一些知识或信息,解决你的编程问题,请考虑捐赠给不幸的人或者你喜欢的慈善机构,除捐赠外,种植树木、志愿服务或减少排碳的行为也很有益处。如果你有任何问题可以在下面 留言
Be the first to comment!
Captcha image
Relative Articles