Go常见的文件操作

2,653 阅读2分钟

创建文件

 func createFile() {
	fileName := ""
	f, err := os.Create(fileName)
	defer f.Close()
	if err != nil {
		// handle error
	} else {
		_, err := f.Write([]byte("写入内容"))
		if err != nil {
			// handle error
		}
	}
}

读取文件

// 一次性读取所有文件1
func ReadAllOnce(path string) string {
	b, e := ioutil.ReadFile("d:/goTest/123.txt")
	if e != nil {
		fmt.Println("read file error")
		return ""
	}
	return string(b)
}

// 一次性读取所有文件2 2快于1
func ReadAllOnce2(path string) string {
    fi, err := os.Open(path)
    if err != nil {
        panic(err)
    }
    defer fi.Close()
    fd, err := ioutil.ReadAll(fi)
    return string(fd)
}


// 一行一行读取
func ReadLineEachTime(path string) []string {
	cs := []string{}
	fi, err := os.Open(path)
	if err != nil {
		fmt.Printf("Error: %s\n", err.Error())
		return cs
	}
	defer fi.Close()
	br := bufio.NewReader(fi)
	for {
		a, _, c := br.ReadLine()
		if c == io.EOF {
			break
		}
		cs = append(cs, string(a))
	}
	return cs
}

向文件中写

代码1:

func write2File() {
	f, err := os.OpenFile("filepath", os.O_WRONLY|os.O_TRUNC, 0600)
	defer f.Close()
	if err != nil {
		// handle error
	} else {
    _, err := f.Write([]byte("写入的内容"))
    // 或者使用  n3, err := f.WriteString("writes\n")
		if err != nil {
			// handle error
		}
	}
}

代码2:

func check(e error) {
    if e != nil {
        panic(e)
    }
}
func main() {
    d1 := []byte("hello\ngo\n")
    err := ioutil.WriteFile("test.txt", d1, 0644)
    check(err)
}

判断文件或者文件夹是否存在

// 判断所给路径文件/文件夹是否存在
func Exists(path string) bool {
	_, err := os.Stat(path) //os.Stat获取文件信息
	if err != nil {
		if os.IsExist(err) {
			return true
		}
		return false
	}
	return true
}

// 判断所给路径是否为文件夹
func IsDir(path string) bool {
	s, err := os.Stat(path)
	if err != nil {
		return false
	}
	return s.IsDir()
}

// 判断所给路径是否为文件
func IsFile(path string) bool {
	return !IsDir(path)
}

获取目录中文件

使用ioutil.ReadDir读取目录中的所有目录和文件(当前层级,不包括子目录) 返回数据类型:

type FileInfo interface {
        Name() string       // base name of the file
        Size() int64        // length in bytes for regular files; system-dependent for others
        Mode() FileMode     // file mode bits
        ModTime() time.Time // modification time
        IsDir() bool        // abbreviation for Mode().IsDir()
        Sys() interface{}   // underlying data source (can return nil)
}

示例:


func viewDir() {
    myfolder := `d:\go_workspace\`
    files, _ := ioutil.ReadDir(myfolder)
    for _, file := range files {
        if file.IsDir() {
            continue
        } else {
            fmt.Println(file.Name())
        }
    }
}

使用递归获取目录及目录中所有的文件

func listFile(myfolder string) {
    files, _ := ioutil.ReadDir(myfolder)
    for _, file := range files {
        if file.IsDir() {
            listFile(myfolder + "/" + file.Name())
        } else {
            fmt.Println(myfolder + "/" + file.Name())
        }
    }
}

获取当前项目的目录

func getPwd() {
    pwd, err := os.Getwd()
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    fmt.Println(pwd)
}

获取文件夹中所有文件以及文件的大小

func main() {
    dirname := "." + string(filepath.Separator)
    d, err := os.Open(dirname)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    defer d.Close()
    fi, err := d.Readdir(-1)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    for _, fi := range fi {
        if fi.Mode().IsRegular() {
            fmt.Println(fi.Name(), fi.Size(), "bytes")
        }
    }
}

重命名

// 重命名文件
func main() {
    originalPath := "./test.txt"
    newPath := "test_new.txt"
    err := os.Rename(originalPath, newPath)
    if err != nil {
        log.Fatal(err)
    }
}
// 重命名目录
func main() {
    originalPath := "test"
    newPath := "test_new"
    err := os.Rename(originalPath, newPath)
    if err != nil {
        log.Fatal(err)
    }
}

判断某个文件的读写权限

func main() {
    //Write permission
    file, err := os.OpenFile("./test.txt", os.O_WRONLY, 0666)
    if err != nil {
        if os.IsPermission(err) {
            log.Println("Error: Write permission denied.")
        }
    }
    file.Close()

    //Read permission
    file, err = os.OpenFile("./test.txt", os.O_RDONLY, 0666)
    if err != nil {
        if os.IsPermission(err) {
            log.Println("Error: Read permission denied.")
        }
    }
    file.Close()
}

参考文章