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

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

01

介绍

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

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

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

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。

fi, err := os.Stat("file1.txt")
 if err != nil {
  fmt.Println(err)
  return
 }

文件权限 FileMode

type FileMode uint32

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

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

fi, err := f.Stat()
 if err != nil {
  fmt.Println(err)
  return
 }
 fileMode := fi.Mode().String()
 fmt.Println(fileMode)

文件 File

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) 读取文件的最大长度的字节。
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) 从文件的字节偏移量位置开始读取最大长度的字节
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 包的用法。


目录
相关文章
|
16天前
|
Ubuntu Linux Go
golang编译成Linux可运行文件
本文介绍了如何在 Linux 上编译和运行 Golang 程序,涵盖了本地编译和交叉编译的步骤。通过这些步骤,您可以轻松地将 Golang 程序编译成适合 Linux 平台的可执行文件,并在目标服务器上运行。掌握这些技巧,可以提高开发和部署 Golang 应用的效率。
127 14
|
4月前
|
Go
Golang的math包常用方法
这篇文章介绍了Golang的math包中的常量和常用方法,并通过示例代码展示了如何使用这些常量和方法。
193 87
Golang的math包常用方法
|
2月前
|
JSON Go 开发者
go-carbon v2.5.0 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 Golang 时间处理库,提供了对时间穿越、时间差值、时间极值、时间判断、星座、星座、农历、儒略日 / 简化儒略日、波斯历 / 伊朗历的支持。
49 4
|
2月前
|
存储 Cloud Native Shell
go库介绍:Golang中的Viper库
Viper 是 Golang 中的一个强大配置管理库,支持环境变量、命令行参数、远程配置等多种配置来源。本文详细介绍了 Viper 的核心特点、应用场景及使用方法,并通过示例展示了其强大功能。无论是简单的 CLI 工具还是复杂的分布式系统,Viper 都能提供优雅的配置管理方案。
|
2月前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
|
3月前
|
Shell Python
Python 的 os 库的应用实例
Python 的 os 库的应用实例
42 3
|
4月前
|
Unix Go
Golang语言标准库time之日期和时间相关函数
这篇文章是关于Go语言日期和时间处理的文章,介绍了如何使用Go标准库中的time包来处理日期和时间。
82 3
|
4月前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
90 3
|
4月前
|
Go
Golang语言基于GOPATH方式管理包(package)
这篇文章详细介绍了Golang语言中基于GOPATH方式管理包(package)的方法,包括包的概述、定义、引入格式、别名使用、匿名引入,以及如何快速入门自定义包,并通过具体代码案例展示了包的环境准备、代码编写、细节说明和程序运行。
49 3
|
4月前
|
Go
Golang语言之包依赖管理
这篇文章详细介绍了Go语言的包依赖管理工具,包括godep和go module的使用,以及如何在项目中使用go module进行依赖管理,还探讨了如何导入本地包和第三方库下载的软件包存放位置。
48 3