前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang 语言的标准库 os 包怎么操作目录和文件?

Golang 语言的标准库 os 包怎么操作目录和文件?

作者头像
frank.
发布2021-03-09 18:22:32
7410
发布2021-03-09 18:22:32
举报

01

介绍

Golang 语言的标准库 os 包提供独立于平台的操作系统相关功能的接口。其设计类似于 Unix,尽管错误处理类似于 Go,调用失败则返回 error 类型的错误,而不是错误编号的值。通常,error 类型的错误中会提供更多信息。

例如 Open 或 Stat,如果返回 error,那么错误将在打印时包含失败的文件名,并且错误类型为 *PathError,可以通过 *PathError 的方法获取更多信息。

代码语言:javascript
复制
type PathError struct {
    Op   string
    Path string
    Err  error
}

os 接口旨在在所有操作系统上保持统一。不通用的功能在系统特定的 syscall 包中实现。

此外,os 包还有三个子包,分别是:

  • os/exec 运行外部命令。
  • os/signal 操作传入的信号。
  • os/user 允许按名称或 ID 查找用户帐户。

但是,本文只介绍 os 包关于目录和文件的操作。

02

函数

os 包提供了很多函数,限于篇幅,我们不会一一介绍,而是主要介绍项目开发中比较常用的关于目录和文件的相关函数。

目录

  • func UserHomeDir() (string, error) 返回当前用户的家目录。
  • func Mkdir(name string, perm FileMode) error 根据给定目录名称和目录权限,创建一个新的目录。
  • func MkdirAll(path string, perm FileMode) error 根据给定目录路径和目录权限,创建所有目录,目录权限作用于被创建的所有目录。
  • func Rename(oldpath, newpath string) error 根据给定的新旧目录名,修改旧目录名,也可用于移动目录。
  • func Remove(name string) error 删除给定名称的文件或空目录。
  • func RemoveAll(path string) error 删除给定路径的所有目录,包含子目录。
  • func Getwd() (dir string, err error) 获取当前的工作目录,如果有多个目录可以到达当前目录,返回任意一个目录。
  • func Chdir(dir string) error 修改当前的工作目录为给定的目录名。

文件

  • func Create(name string) (*File, error) 创建或截断给定文件,如果给定文件已存在,将被截断,如果给定文件不存在,将被创建,并且文件权限为 0666
  • func Open(name string) (*File, error) 打开要读取的文件,文件权限为只读。
  • func OpenFile(name string, flag int, perm FileMode) (*File, error) 根据给定文件名、flag 和文件权限,打开该文件,如果该文件不存在,可以通过 flag 传值 O_CREATE 创建文件,多个 flag 使用 | 分隔,例如 O_CREATE|O_APPEND

03

文件

文件信息 FileInfo interface

代码语言:javascript
复制
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)
}

FileInfo 接口封装了文件信息相关的方法,可以通过函数 StatLstat 获取 FileInfo。

代码语言:javascript
复制
fi, err := os.Stat("file1.txt")
 if err != nil {
  fmt.Println(err)
  return
 }

文件权限 FileMode

代码语言:javascript
复制
type FileMode uint32

FileMode 可以用于获取文件权限。

获取文件权限的示例代码:

代码语言:javascript
复制
fi, err := f.Stat()
 if err != nil {
  fmt.Println(err)
  return
 }
 fileMode := fi.Mode().String()
 fmt.Println(fileMode)

文件 File

代码语言:javascript
复制
type File struct {
    // contains filtered or unexported fields
}

File 表示打开的文件描述符,它提供了一些操作文件的方法。

关于文件的操作,主要分为打开、关闭和读写,关于打开文件的三种方式,已在 Part 02 函数部分介绍,关闭文件是调用函数 Close,为了防止忘记关闭文件,通常和 defer 搭配使用。

下面主要介绍读写文件。

写文件

  • func (f *File) Write(b []byte) (n int, err error) Write 方法将给定字节切片写入文件。
  • func (f *File) WriteAt(b []byte, off int64) (n int, err error) WriteAt 方法指定文件的字节偏移位置,将给定字节切片写入文件,如果文件是 O_APPEND,WriteAt 返回错误。
  • func (f *File) WriteString(s string) (n int, err error) WriteString 方法使用方式和 Write 方法相同,区别是写入内容由字节切片改为字符串。
  • func (f *File) Truncate(size int64) error 根据给定参数,截断文件。

读文件

  • func (f *File) Read(b []byte) (n int, err error) 读取文件的最大长度的字节。
代码语言:javascript
复制
b := make([]byte, 5)
 n, err := f.Read(b)
 if err != nil {
  fmt.Println(err)
  return
 }
 fmt.Println(b)
 fmt.Println(string(b))
 fmt.Println(n)
  • func (f *File) ReadAt(b []byte, off int64) (n int, err error) 从文件的字节偏移量位置开始读取最大长度的字节
代码语言:javascript
复制
b := make([]byte, 5)
 n, err := f.ReadAt(b, 10)
 if err != nil {
  fmt.Println(err)
  return
 }
 fmt.Println(b)
 fmt.Println(n)
 fmt.Println(string(b))

04

总结

本文主要介绍的是通过 Golang 语言标准库 os 包如何操作目录和文件,此外,os 包还有其他用法,比如操作环境变量。建议感兴趣的读者阅读 os 包的官方文档,了解更多关于 os 包的用法。

推荐阅读:

Golang 语言怎么使用 gomail 库发送邮件?

Golang 语言三方库 lumberjack 日志切割组件怎么使用?

Go team 开源项目 Go Cloud 使用的依赖注入工具 Wire 怎么使用?

Golang 语言的值验证库 Validator 怎么使用?

Golang语言使用 jwt-go 库生成和解析 token

参考资料:

https://golang.org/pkg/os/

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-08,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 Go语言开发栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com