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 包的用法。


目录
相关文章
|
1月前
|
Go
Golang的math包常用方法
这篇文章介绍了Golang的math包中的常量和常用方法,并通过示例代码展示了如何使用这些常量和方法。
164 87
Golang的math包常用方法
|
2月前
|
存储 Unix Linux
操作系统——目录相关
操作系统——目录相关
34 0
|
1月前
|
存储 Go
Golang语言基于go module方式管理包(package)
这篇文章详细介绍了Golang语言中基于go module方式管理包(package)的方法,包括Go Modules的发展历史、go module的介绍、常用命令和操作步骤,并通过代码示例展示了如何初始化项目、引入第三方包、组织代码结构以及运行测试。
33 3
|
1月前
|
Go
Golang语言基于GOPATH方式管理包(package)
这篇文章详细介绍了Golang语言中基于GOPATH方式管理包(package)的方法,包括包的概述、定义、引入格式、别名使用、匿名引入,以及如何快速入门自定义包,并通过具体代码案例展示了包的环境准备、代码编写、细节说明和程序运行。
31 3
|
1月前
|
Go
Golang语言之包依赖管理
这篇文章详细介绍了Go语言的包依赖管理工具,包括godep和go module的使用,以及如何在项目中使用go module进行依赖管理,还探讨了如何导入本地包和第三方库下载的软件包存放位置。
24 3
|
2月前
|
机器学习/深度学习 存储 人工智能
Golang bytes 包学习
Golang bytes 包学习
17 3
|
2月前
|
Go 开发者
|
2月前
|
存储 测试技术 Go
Golang 包:构建模块化代码的基石
【8月更文挑战第31天】
36 0
|
3月前
|
负载均衡 Serverless API
函数计算操作报错合集之如何解决上传二进制包时报错: "Permission denied (os error 13)"
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
3月前
|
弹性计算 运维 安全
【实践】使用操作系统智能助手OS Copilot解锁操作系统运维与编程
体验阿里云OS Copilot,运维人员进行Linux环境配置,包括初始化、修改密码和设置端口。工具提供知识问答、辅助编程功能,能理解口语化指令,但对复杂编程任务有限制。作为运维,给予产品8分,愿意推荐并参与开源开发。产品优点在于准确度,期待扩展更多语言支持和智能故障排查。不足之处包括资源续费说明不清、特定问题回答不准确和需实时学习更新。
下一篇
无影云桌面