Go 文件编程

admin
admin 2020年04月07日
  • 在其它设备中阅读本文章

目录和文件管理方法由 Go 语言 标准库 os 包 提供

一、目录管理

相关函数:

func Mkdir(name string, perm FileMode) error  // 创建名称为name的目录
func MkdirAll(path string, perm FileMode) error  // 根据path创建多级子目录
func Remove(name string) error  // 删除名称为name的目录或文件,当目录下有文件或目录时出错
func RemoveAll(path string) error  // 根据path删除多级子目录,该目录下的子目录全部删除

文件权限说明:采用 linux 系统的权限管理方式,在 go 语言里以 0 开头来 8 进制的数字来表示文件权限,故全权限用 0777 表示
实例:

package main

import (
    "fmt"
    "os"
)

func main() {
    os.Mkdir("test", 0777)
    os.MkdirAll("test/test1/test2", 0777)
    err := os.Remove("test")
    if err != nil {
        fmt.Println(err)
    }
    os.RemoveAll("test")
}

二、文件管理

相关函数:

func Create(name string) (file *File, err Error)  // 根据提供的文件名创建新的文件
func NewFile(fd uintptr, name string) *File  //根据文件描述符和文件名创建相应的文件
func Remove(name string) Error  //删除文件,和删除文件夹是同一个函数

文件描述符:go 程序并不是直接操作文件,而是通过操作系统提供的接口去操作文件(其它编程语言都是这样的),打开现存文件或新建文件时,操作系统内核会返回一个文件描述符(实质是一个非负整数),读写文件也需要使用文件描述符来指定待读写的文件。
实例:

package main

import (
    "fmt"
    "os"
)

func main() {
    fileName := "testFile"
    currFile,err:=os.Create(fileName)
    if err!= nil {
        fmt.Println(err,currFile);
    }
    Close(currFile)
}

Go 程序中有三个默认已经打开的文件:

  • os.Stdin: 标准输入
  • os.Stdout: 标准输出
  • os.Stderr: 标准错误输出

三、文件打开和关闭

相关函数:

func Open(name string) (*File, error) //Open打开一个文件用于读取
func OpenFile(name string, flag int, perm FileMode) (*File, error) //OpenFile是一个更一般性的文件打开函数
func (f *File) Close() error  //Close关闭文件f,使文件不能用于读写

文件打开模式:

const (
    O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
    O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
    O_RDWR   int = syscall.O_RDWR   // 读写模式打开文件
    O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
    O_CREATE int = syscall.O_CREAT  // 如果不存在将创建一个新文件
    O_EXCL   int = syscall.O_EXCL   // 和O_CREATE配合使用,文件必须不存在
    O_SYNC   int = syscall.O_SYNC   // 打开文件用于同步I/O
    O_TRUNC  int = syscall.O_TRUNC  // 如果可能,打开时清空文件
)

实例:

package main

import (
    "os"
)

func main() {
    file, err := os.Open("/home/test.txt") //只读打开
    if err != nil {
        fmt.Println("open file error: ", err)
        return
    }
    file.Close() //关闭文件
}

目录也是可以打开和关闭的,和文件一样的

四、文件操作方法详细说明

os.File 是一个结构体,其封装了诸多操作文件的方法:

    func Create(name string) (*File, error) //Create采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件,如果文件已存在会截断它(为空文件)。如果成功,返回的文件对象可用于I/O;对应的文件描述符具有O_RDWR模式。如果出错,错误底层类型是*PathError。
    func NewFile(fd uintptr, name string) *File //NewFile使用给出的Unix文件描述符和名称创建一个文件。
    func Open(name string) (*File, error) //Open打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY模式。如果出错,错误底层类型是*PathError。
    func OpenFile(name string, flag int, perm FileMode) (*File, error) //OpenFile是一个更一般性的文件打开函数,大多数调用者都应用Open或Create代替本函数。它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是*PathError。
    func Pipe() (r *File, w *File, err error) //Pipe返回一对关联的文件对象。从r的读取将返回写入w的数据。本函数会返回两个文件对象和可能的错误。
    func (f *File) Chdir() error //Chdir将当前工作目录修改为f,f必须是一个目录。如果出错,错误底层类型是*PathError。
    func (f *File) Chmod(mode FileMode) error //Chmod修改文件权限。如果出错,错误底层类型是*PathError。
    func (f *File) Chown(uid, gid int) error //修改文件文件用户id和组id 
    func (f *File) Close() error  //Close关闭文件f,使文件不能用于读写。它返回可能出现的错误。
    func (f *File) Fd() uintptr //Fd返回与文件f对应的整数类型的Unix文件描述符。
    func (f *File) Name() string //Name方法返回(提供给Open/Create等方法的)文件名称。
    func (f *File) Read(b []byte) (n int, err error) //Read方法从f中读取最多len(b)字节数据并写入b。它返回读取的字节数和可能遇到的任何错误。文件终止标志是读取0个字节且返回值err为io.EOF。
    func (f *File) ReadAt(b []byte, off int64) (n int, err error) //ReadAt从指定的位置(相对于文件开始位置)读取len(b)字节数据并写入b。它返回读取的字节数和可能遇到的任何错误。当n<len(b)时,本方法总是会返回错误;如果是因为到达文件结尾,返回值err会是io.EOF。
    func (f *File) Readdir(n int) ([]FileInfo, error) //Readdir读取目录f的内容,返回一个有n个成员的[]FileInfo,这些FileInfo是被Lstat返回的,采用目录顺序。对本函数的下一次调用会返回上一次调用剩余未读取的内容的信息。如果n>0,Readdir函数会返回一个最多n个成员的切片。这时,如果Readdir返回一个空切片,它会返回一个非nil的错误说明原因。如果到达了目录f的结尾,返回值err会是io.EOF。如果n<=0,Readdir函数返回目录中剩余所有文件对象的FileInfo构成的切片。此时,如果Readdir调用成功(读取所有内容直到结尾),它会返回该切片和nil的错误值。如果在到达结尾前遇到错误,会返回之前成功读取的FileInfo构成的切片和该错误。
    func (f *File) Readdirnames(n int) (names []string, err error) //Readdir读取目录f的内容,返回一个有n个成员的[]string,切片成员为目录中文件对象的名字,采用目录顺序。对本函数的下一次调用会返回上一次调用剩余未读取的内容的信息。如果n>0,Readdir函数会返回一个最多n个成员的切片。这时,如果Readdir返回一个空切片,它会返回一个非nil的错误说明原因。如果到达了目录f的结尾,返回值err会是io.EOF。如果n<=0,Readdir函数返回目录中剩余所有文件对象的名字构成的切片。此时,如果Readdir调用成功(读取所有内容直到结尾),它会返回该切片和nil的错误值。如果在到达结尾前遇到错误,会返回之前成功读取的名字构成的切片和该错误。
    func (f *File) Seek(offset int64, whence int) (ret int64, err error) //Seek设置下一次读/写的位置。offset为相对偏移量,而whence决定相对位置:0为相对文件开头,1为相对当前位置,2为相对文件结尾。它返回新的偏移量(相对开头)和可能的错误。
    func (f *File) SetDeadline(t time.Time) error // 设置文件读取和写入时间,超时返回错误
    func (f *File) SetReadDeadline(t time.Time) error //设置文件读取时间
    func (f *File) SetWriteDeadline(t time.Time) error // 设置文件写入时间
    func (f *File) Stat() (FileInfo, error) //Stat返回描述文件f的FileInfo类型值。如果出错,错误底层类型是*PathError。
    func (f *File) Sync() error //Sync递交文件的当前内容进行稳定的存储。一般来说,这表示将文件系统的最近写入的数据在内存中的拷贝刷新到硬盘中稳定保存。
    func (f *File) Truncate(size int64) error //Truncate改变文件的大小,它不会改变I/O的当前位置。 如果截断文件,多出的部分就会被丢弃。如果出错,错误底层类型是*PathError。
    func (f *File) Write(b []byte) (n int, err error) //Write向文件中写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法会返回一个非nil的错误。
    func (f *File) WriteAt(b []byte, off int64) (n int, err error) //将len(b)字节写入文件,从字节偏移开始。它返回写入的字节数和错误,写的时候返回一个错误,当n != len(b)
    func (f *File) WriteString(s string) (n int, err error) //WriteString类似Write,参数为字符串。