文件操作


想要进行目录、文件等的操作,基本上就是查看os包,可以使用的函数很多,逐一谈好像也没太大意义,基本上若对目录、文件以及权限等有所认识,应该查查文件、搜寻一些范例,大致就知道怎么用吧!

无论如何,输入输出中最基本的就是文件读写,至今为止看过,要开启文件进行读取的话,使用的是os.Open函数,这会以只读方式开启既有的文件(否则会有PathError):

func Open(name string) (*File, error)

如果要指定读写方式与权限的话,要使用os.OpenFile

func OpenFile(name string, flag int, perm FileMode) (*File, error)

flag可以指定的常数有:

const (
    // 必须指定 O_RDONLY、O_WRONLY 或 O_RDWR
    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  // 文件开启时清空文件
)

perm的话是文件八进制权限,例如 0777;另外,还有个os.Create,实现上就是使用OpenFile以 0666 的方式创建可读写的文件(清空文件):

func Create(name string) (*File, error) {
    return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666)
}

OpenOpenFileCreate都会返回*os.File;另外还有个NewFile,多数情况下用不到,主要是在将文件描述(File descriptor)以*os.File来表示,例如,os.Stdinos.Stdoutos.Stderr,在〈从标准输入、输出认识 io〉看过它的使用:

var (
    Stdin  = NewFile(uintptr(syscall.Stdin), "/dev/stdin")
    Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout")
    Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr")
)

syscall.Stdinsyscall.Stdoutsyscall.Stderr分别是标准输入、输出、错误的文件描述,这在syscall的文件可以看到:

var (
    Stdin  = 0
    Stdout = 1
    Stderr = 2
)

os.File实现了io.Readerio.Writer等行为,因此只要知道〈io.Reader、io.Writer〉,剩下的就是查询文件,看看有哪些方法可以使用,没什么特别需要示范的了,倒是若需要简单的文件读写,可以看看ioutil,其中有些简便的函数:

func NopCloser(r io.Reader) io.ReadCloser
func ReadAll(r io.Reader) ([]byte, error)
func ReadDir(dirname string) ([]os.FileInfo, error)
func ReadFile(filename string) ([]byte, error)
func TempDir(dir, prefix string) (name string, err error)
func TempFile(dir, pattern string) (f *os.File, err error)
func WriteFile(filename string, data []byte, perm os.FileMode) error

ReadFileWriteFile只要指定文件名称等,代码上不需要自行创建文件、缓冲区之类的,这些函数在ioutil的文件中,都有范例可以参考。


展开阅读全文