os

在Go语言中,os包提供了操作系统功能的接口。它的设计是Unix-like的,但错误处理是Go风格的;它提供了与操作系统平台无关的接口。这个包主要用于文件操作、环境变量、命令行参数、进程管理等。

1 常量

  • 文件打开标志:用于 OpenFile() 函数的文件操作控制(按位或组合使用):

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  // 打开时清空文件
)

组合示例:

// 以读写模式打开文件,不存在则创建,追加写入
file, err := os.OpenFile("log.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)
  • 文件模式:描述文件类型和权限的位掩码(继承自 fs 包)

2 变量

  • 预定义错误变量:这些错误提供了标准化的错误检查方式,可与 errors.Is() 配合使用

  • 示例

  • 标准输入/输出流:预定义的全局文件对象,对应操作系统的标准数据流

3 函数

3.1 func Mkdir(name string, perm FileMode) error

​功能​​:创建单级目录 ​​权限​​:perm 为 Unix 风格权限位(如 0755)

​注意​​:

  • 仅创建单级目录

  • 父目录不存在会返回 IsNotExist 错误

  • Windows 系统下权限位仅控制只读属性

3.2 func MkdirAll(path string, perm FileMode) error

​功能​​:递归创建多级目录(类似 mkdir -p

​注意​​:

  • 成功时不报错(即使目录已存在)

  • 目录部分存在时会自动续建后续部分

  • 比循环调用 Mkdir 更高效

3.3 func MkdirTemp(dir, pattern string) (string, error)

​功能​​:创建临时目录(Go 1.16+)

​注意​​:

  • dir 为空时使用 os.TempDir() 路径

  • pattern 中的 * 会被随机字符串替换

  • 需手动删除(不会自动清理)

3.4 func Remove(name string) error

​功能​​:删除文件或空目录

​注意​​:

  • 无法删除非空目录(返回 ErrExist

  • 删除符号链接仅移除链接本身

  • Windows 中删除后可能短暂无法创建同名文件

3.5 func RemoveAll(path string) error

​功能​​:递归删除目录及其所有内容(类似 rm -rf

​警告​​:

  • ⚠️ 极度危险!无确认机制直接删除

  • 路径错误可能导致数据意外删除

  • 返回 nil 不代表所有文件都删除成功(某些系统限制)

3.6 func Rename(oldpath, newpath string) error

​功能​​:重命名/移动文件或目录

​注意​​:

  • 跨磁盘移动时可能失败(某些系统不支持)

  • 目标存在时会覆盖(非原子操作)

  • 移动目录时要确保目标路径为空

​功能​​:创建硬链接

​限制​​:

  • 无法为目录创建硬链接(POSIX限制)

  • 不能跨磁盘/分区创建

  • Windows 需要 SeCreateSymbolicLinkPrivilege 权限

​功能​​:创建符号链接(软链接)

​注意​​:

  • oldname 可以是相对路径或绝对路径

  • Windows 需要管理员权限(默认情况下)

  • 目标不存在也可成功创建(悬垂链接)

​功能​​:获取符号链接的实际目标路径

​注意​​:

  • 非符号链接返回 ErrInvalid

  • 结果可能是相对路径

  • Windows 可能需要启用开发者模式

3.10 func Pipe() (r *File, w *File, err error)

​功能​​:创建匿名管道(用于进程内通信)

​关键点​​:

  • 管道内容在内存中,大小有限(通常64KB)

  • 需要同步关闭写端才能触发读端EOF

  • 不适合大文件传输(可能阻塞)

3.11 func ReadFile(name string) ([]byte, error)

​功能​​:读取整个文件内容到内存 ​​返回值​​:

  • []byte:文件内容字节切片

  • error:读取错误(如文件不存在、权限不足等)

​关键注意事项​​:

  • ⚠️ 最大文件限制:根据可用内存决定,通常不适合 >1GB 文件

  • 文件被锁定直到读取完成(单次操作处理)

  • Windows 路径需处理 \(如 C:\\data\\file.txt

3.12 func WriteFile(name string, data []byte, perm FileMode) error

​功能​​:创建或覆盖文件并写入数据 ​​返回值​​:

  • error:写入错误(如权限不足、磁盘满等)

​关键注意事项​​:

  • ⚠️ 数据安全:写入过程中崩溃可能导致文件损坏(使用原子写入)

  • 权限继承:新文件权限由 perm 参数决定(不受 umask 影响)

  • 并发写入:需外部同步机制(如文件锁)

3.13 func Truncate(name string, size int64) error

​功能​​:修改文件大小(截断或扩展) ​​返回值​​:

  • error:操作错误(如文件不存在、权限不足等)

​关键注意事项​​:

  • ⚠️ 数据丢失:截断操作会丢弃超出部分(不可恢复)

  • 扩展行为:

    • 稀疏文件(Linux/Unix):快速扩展,不实际占用磁盘

    • 非稀疏文件:填充空字节(\x00),可能触发磁盘分配

  • 系统限制:

    • FAT32 文件系统不支持 >4GB 文件

    • 超出磁盘空间返回 ENOSPC 错误

3.14 func Chmod(name string, mode FileMode) error

​功能​​:修改文件或目录的权限位 ​​参数说明​​:

  • name:文件/目录路径

  • mode:Unix风格的权限位值(如0644) ​​返回值​​:成功返回 nil,失败返回错误对象

​错误返回情况​​:

  • 路径不存在时返回 ErrNotExist

  • 权限不足时返回 ErrPermission

  • 路径指向目录但无执行权限时可能返回错误

  • Windows上只读文件修改权限可能失败

  • 传入无效路径格式时返回路径错误

  • Unix系统权限模式为八进制值(如0644)

  • Windows只支持设置只读属性(其他权限无效)

  • 修改权限需要文件所有者或管理员权限

  • 目录需要执行(x)权限才能访问内容

  • 修改符号链接会影响其目标文件

3.15 func Chown(name string, uid, gid int) error

​功能​​:修改文件所有者 ​​参数说明​​:

  • name:文件/目录路径

  • uid:用户ID(-1保持原值)

  • gid:组ID(-1保持原值) ​​返回值​​:成功返回 nil,失败返回错误对象

​错误返回情况​​:

  • 路径不存在时返回 ErrNotExist

  • 权限不足时返回 ErrPermission

  • 指定用户/组不存在时返回系统错误

  • Windows系统总是返回不支持错误

  • NFS文件系统可能返回服务端错误

注意事项​​:

  • Windows系统完全不支持此功能

  • 需要root权限或CAP_CHOWN能力

  • 修改目录时不会递归影响子项

  • 确保用户/组ID存在于系统中

  • 修改后可能影响文件访问权限

3.16 func Lchown(name string, uid, gid int) error

​功能​​:修改符号链接自身所有者 ​​参数说明​​:同Chown​返回值​​:同Chown

​错误返回情况​​:

  • 符号链接不存在时返回 ErrNotExist

  • 权限不足时返回 ErrPermission

  • Windows系统总是返回不支持错误

  • 旧UNIX系统可能不支持此操作

  • 无效链接路径返回路径错误

注意事项​​:

  • Chown的区别在于不跟随符号链接

  • 修改链接所有权不影响目标文件

  • 需要与Chown相同的权限级别

  • 某些旧文件系统可能不支持此操作

  • 系统关键链接修改可能导致功能异常

3.17 func Chtimes(name string, atime time.Time, mtime time.Time) error

​功能​​:修改访问时间(atime)和修改时间(mtime) ​​参数说明​​:

  • name:文件/目录路径

  • atime:新的访问时间

  • mtime:新的修改时间 ​​返回值​​:成功返回 nil,失败返回错误对象

​错误返回情况​​:

  • 路径不存在时返回 ErrNotExist

  • 权限不足时返回 ErrPermission

  • FAT32文件系统可能返回无效时间错误

  • 挂载为noatime的文件系统返回权限错误

  • 超出文件系统时间范围返回无效参数错误

注意事项​​:

  • FAT32文件系统仅支持2秒精度

  • noatime挂载选项会禁用访问时间更新

  • 修改目录时间会影响父目录的mtime

  • NTFS支持100纳秒精度

  • 时间修改可能影响备份和同步系统

3.18 func Environ() []string

​功能​​:获取所有环境变量的副本 ​​返回值​​:字符串切片,格式为 KEY=VALUE

注意事项​​:

  • 返回的是当前进程环境变量的拷贝

  • 修改返回的切片不会影响实际环境变量

  • Windows 环境变量名称不区分大小写

  • 结果包含父进程传递的所有环境变量

  • 敏感信息(如密码)可能暴露在输出中

3.19 func Clearenv()

​功能​​:清除所有环境变量 ​

注意事项​​:

  • 立即删除所有环境变量

  • 子进程会继承当前空环境

  • 清除后无法自动恢复之前的状态

  • 可能导致依赖环境的应用崩溃

  • 仅应在严格控制的场景使用

3.20 func ExpandEnv(s string) string

​功能​​:替换字符串中的环境变量占位符 ​​参数​​:s - 包含环境变量引用的字符串 ​​返回值​​:已展开的字符串

注意事项​​:

  • 仅支持 $VAR${VAR} 格式

  • 未设置变量替换为空字符串

  • Windows 支持 %VAR% 格式(自动转换)

  • 不支持默认值语法如 ${VAR|default}

  • 递归替换可能导致死循环(如 A=$B, B=$A

3.21 func Getenv(key string) string

​功能​​:获取指定环境变量的值 ​​参数​​:key - 环境变量名 ​​返回值​​:变量值(未设置返回空字符串)

注意事项​​:

  • 变量名区分大小写(Windows 除外)

  • 返回值为字符串类型

  • 未定义时返回空字符串而非错误

  • 包含敏感信息时注意安全处理

  • 无法检测变量是否存在或已被设置

3.22 func Setenv(key, value string) error

​功能​​:设置环境变量 ​​参数​​:

  • key - 环境变量名

  • value - 要设置的值 ​​返回值​​:成功返回 nil,错误返回错误对象

错误返回情况​​:

  • 无效变量名(如包含 = 字符)

  • 内存分配失败(系统资源耗尽)

  • 安全策略限制(如 SELinux)

  • 长度超过系统限制

  • Windows 的 %PATH% 超长错误

注意事项​​:

  • 仅影响当前进程及子进程

  • Windows 最长约32K字符(所有变量总和)

  • 变量名建议全大写字母和数字

  • 设置后无法通过 Unsetenv 完全清除内存痕迹

  • 高安全场景应避免在环境变量中存储密码

3.23 func Unsetenv(key string) error

​功能​​:删除环境变量 ​​参数​​:key - 环境变量名 ​​返回值​​:成功返回 nil,错误返回错误对象

错误返回情况​​:

  • 无效变量名(包含特殊字符)

  • 未实现该系统调用(旧系统)

  • 安全策略限制

  • Windows 某些核心变量无法删除

​注意事项​​:

  • Windows 不保证立即移除内存内容

  • 对不存在变量操作不返回错误

  • 删除后子进程无法访问该变量

  • 不会影响同名变量在不同进程中的值

  • 某些系统变量删除可能导致意外行为

3.24 func LookupEnv(key string) (string, bool)

​功能​​:安全获取环境变量值 ​​参数​​:key - 环境变量名 ​​返回值​​:

  • 第一个值:变量值

  • 第二个值:变量是否存在的布尔值

注意事项​​:

  • 正确区分空值和未设置状态

  • Getenv 更安全的替代方案

  • Windows 变量名大小写不敏感

  • 即使存在也可能返回空值

  • 适合处理重要配置参数

3.25 func Expand(s string, mapping func(string) string) string

​功能​​:自定义变量展开规则 ​​参数​​:

  • s - 要处理的字符串

  • mapping - 自定义替换函数 ​​返回值​​:已展开的字符串

注意事项​​:

  • 支持 $VAR${VAR} 语法

  • mapping 函数负责转换变量名到值

  • 未处理的变量名返回空字符串

  • 可用来实现复杂模板引擎

  • 注意防止恶意输入导致无限递归

3.26 func Chdir(dir string) error

​功能​​:更改当前工作目录 ​​参数​​:dir - 目标路径(绝对或相对路径) ​​返回值​​:成功返回 nil,失败返回错误对象

错误情况​​:

  • ErrNotExist:目录不存在

  • ErrPermission:没有目录访问权限

  • Windows 无效设备错误

  • 相对路径解析失败

  • 符号链接目标无效

​注意事项​​:

  • 影响整个进程的工作目录

  • Windows 路径使用反斜杠(建议用 filepath.Join()

  • 目标目录需要执行权限(UNIX系统)

  • 绝对路径更安全可靠

  • 使用 defer 恢复原始工作目录

3.27 func Getwd() (string, error)

​功能​​:获取当前工作目录的绝对路径 ​​返回值​​:路径字符串和错误对象

错误情况​​:

  • ErrPermission:目录访问权限不足

  • ErrNotExist:目录已被删除

  • 路径长度超过系统限制

  • 网络路径断开连接

  • 内存分配失败

3.28 func TempDir() string

​功能​​:获取系统临时目录路径 ​​返回值​​:临时目录路径(字符串)

注意事项​​:

  • Windows: %TEMP%%TMP%

  • Unix: /tmp

  • 目录权限通常为 0777

  • 文件可能被系统自动清理

  • 敏感文件应设置适当权限

3.29 func UserCacheDir() (string, error)

​功能​​:获取用户缓存目录路径 ​​返回值​​:路径字符串和错误对象

平台路径​​:

  • Windows: %LOCALAPPDATA%

  • macOS: ~/Library/Caches

  • Linux: ~/.cache

  • 错误情况:用户配置不可用或权限问题

3.30 func UserCacheDir() (string, error)

​功能​​:获取用户缓存目录路径 ​​返回值​​:路径字符串和错误对象

​平台路径​​:

  • Windows: %LOCALAPPDATA%

  • macOS: ~/Library/Caches

  • Linux: ~/.cache

  • 错误情况:用户配置不可用或权限问题

3.31 func UserConfigDir() (string, error)

​功能​​:获取用户配置目录路径 ​​返回值​​:路径字符串和错误对象

​平台路径​​:

  • Windows: %APPDATA%

  • macOS: ~/Library/Application Support

  • Linux: ~/.config

  • XDG兼容系统:遵循 XDG 规范

3.32 func UserHomeDir() (string, error)

​功能​​:获取用户主目录路径 ​​返回值​​:路径字符串和错误对象

​错误情况​​:

  • 用户目录未设置(无 $HOME

  • 用户账号无效

  • 虚拟环境限制

  • 权限问题

  • 内存分配失败

3.33 func Getpid() int

​功能​​:获取当前进程ID ​​返回值​​:进程ID(整数值)

​注意事项​​:

  • 在Unix系统中PID可重复使用

  • Windows中PID为32位值

  • 容器环境下为容器内PID

  • 返回值在进程生命周期内不变

  • 可安全用于日志标识

3.34 func Getppid() int

​功能​​:获取父进程ID ​​返回值​​:父进程ID(整数值)

​注意事项​​:

  • 父进程结束后返回1(init进程ID)

  • Windows中为创建当前进程的进程ID

  • 容器环境下为容器父进程

  • 返回值在进程启动后不变

  • 守护进程的父进程通常是init

3.35 func Getuid() int 和 func Geteuid() int

​功能​​:

  • Getuid(): 获取实际用户ID

  • Geteuid(): 获取有效用户ID ​​返回值​​:用户ID整数值

​注意事项​​:

  • Windows返回-1或0

  • 通常实际ID用于文件创建

  • 有效ID用于权限检查

  • SUID程序显示euid为root

  • 容器中UID可能映射到非零值

3.36 func Getgid() int 和 func Getegid() int

​功能​​:

  • Getgid(): 获取实际组ID

  • Getegid(): 获取有效组ID ​​返回值​​:组ID整数值

​注意事项​​:

  • Windows返回0

  • 实际组ID用于文件创建

  • 有效组ID用于权限检查

  • SGID程序显示egid为特权组

  • 文件权限需检查主组和辅助组

3.37 func Getgroups() ([]int, error)

​功能​​:获取辅助组ID列表 ​​返回值​​:组ID切片和错误对象

​错误情况​​:

  • ENOSYS:系统不支持(Windows)

  • EINVAL:组数超过限制

  • EPERM:权限不足

  • ENOMEM:内存分配失败

  • 系统资源耗尽

​注意事项​​:

  • 结果包含主要组ID

  • Unix系统最多支持NGROUPS_MAX个组

  • Windows总是返回空切片

  • 容器环境可能返回主机组ID

  • 修改用户组后需要重启进程生效

3.38 func Exit(code int)

​功能​​:立即终止当前进程 ​​参数​​:code - 退出状态码

​注意事项​​:

  • 跳过所有defer函数执行

  • 立即终止程序不返回

  • 子进程不受影响

  • Windows状态码范围0-255

  • 避免在库函数中使用

  • 非0状态码表示失败

​推荐状态码​​:

  • 0: 成功退出

  • 1: 一般错误

  • 2: 命令行错误

  • 126: 权限不足

  • 127: 命令未找到

  • 130: Ctrl+C终止 (SIGINT)

  • 137: OOM终止 (SIGKILL)

3.39 func IsExist(err error) bool

​功能​​:检查是否为"已存在"错误 ​​参数​​:错误对象 ​​返回值​​:相关错误时返回 true

函数
功能说明

IsExist(err error) bool

是否"文件已存在"错误

IsNotExist(err error) bool

是否"文件不存在"错误

IsPermission(err error) bool

是否权限错误

IsTimeout(err error) bool

是否超时错误

IsPathSeparator(c uint8) bool

是否是路径分隔符

NewSyscallError(syscall string, err error) error

创建系统调用错误

3.40 func SameFile(fi1, fi2 FileInfo) bool

​功能​​:检查文件是否相同 ​​参数​​:两个文件信息对象 ​​返回值​​:相同返回 true

注意事项​​:

  • 比较 inode 和设备 ID

  • 硬链接文件返回 true

  • 路径不同但指向相同文件返回 true

  • 文件删除后重新创建可能不同

  • 不适用于网络文件系统

4 类型

4.1 File类型

os.File 是 Go 语言标准库中处理文件 I/O 的核心类型,代表操作系统文件描述符的封装。

4.1.1 func Create(name string) (*File, error)

​功能​​:创建新文件,如果文件已存在则截断 ​​参数​​:

  • name:文件路径 ​​返回值​​:

  • *File:文件对象

  • error:创建失败的错误

注意事项​​:

  • 如果文件已存在,会​​截断​​(清空)原文件

  • Windows 路径可以使用反斜杠 \

  • 默认权限为 0666(所有人可读写)

  • 重要错误情况:

    • ErrPermission:目录没有写权限

    • ErrNotExist:父目录不存在

    • EEXIST:路径已存在但非文件(Linux)

4.1.2 func CreateTemp(dir, pattern string) (*File, error)

功能​​:在指定目录创建临时文件 ​​参数​​:

  • dir:目标目录(空表示默认临时目录)

  • pattern:文件名模式(支持 * 通配符) ​​返回值​​:

  • *File:文件对象

  • error:创建失败的错误

注意事项​​:

  • 文件名会替换 * 为随机字符

  • 目录必须有写权限

  • 临时文件不会自动删除

  • 重要错误情况:

    • ErrPermission:目录没有写权限

    • ErrNotExist:目录不存在

4.1.3 func NewFile(fd uintptr, name string) *File

​功能​​:根据文件描述符创建文件对象 ​​参数​​:

  • fd:文件描述符

  • name:文件名(可空) ​​返回值​​:文件对象(无错误)

注意事项​​:

  • 主要用于转换系统调用的文件描述符

  • 需确保描述符有效

  • ​不会​​自动关闭底层文件描述符

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

​功能​​:以只读方式打开文件 ​​参数​​:

  • name:文件路径 ​​返回值​​:

  • *File:文件对象

  • error:打开失败的错误

注意事项​​:

  • 只读模式,不允许写入

  • 文件必须存在

  • 重要错误情况:

    • ErrNotExist:文件不存在

    • ErrPermission:无读取权限

    • EISDIR:路径是目录(Linux)

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

功能​​:灵活打开文件 ​​参数​​:

  • name:文件路径

  • flag:打开标志(见下表)

  • perm:文件权限(创建时生效)

注意事项​​:

  • O_RDONLY | O_WRONLY | O_RDWR 必须指定一个

  • O_EXCL 需要与 O_CREATE 一起使用

  • 权限位仅在创建文件时生效

  • 重要错误情况:

    • EEXIST:使用 O_EXCL 但文件存在

    • EACCES:权限不足(Linux)

    • ENOTDIR:路径前缀存在但不是目录

4.1.6 func (f *File) Read(b []byte) (n int, err error)

功能​​:从当前位置读取数据 ​​参数​​:

  • b:目标字节切片 ​​返回值​​:

  • n:实际读取字节数

  • err:错误(常为 io.EOF

注意事项​​:

  • 会修改文件偏移量

  • n < len(b) 时不一定是错误

  • io.EOF 表示文件结束

  • 可能返回 0, nil

4.1.7 func (f *File) Write(b []byte) (n int, err error)

​功能​​:向文件写入数据 ​​参数​​:

  • b:源字节切片 ​​返回值​​:

  • n:实际写入字节数

  • err:写入错误

注意事项​​:

  • 实际写入数小于请求数时为错误

  • 追加模式 (O_APPEND) 下总是写到文件尾

  • 重要错误:

    • EBADF:文件未打开为写入

    • ENOSPC:磁盘满

    • EINTR:信号中断

4.1.8 func (f *File) ReadAt(b []byte, off int64) (n int, err error)

​功能​​:从指定位置读取(不影响偏移) ​​参数​​:

  • b:目标缓冲区

  • off:读取位置 ​​返回值​​:同 Read

注意事项​​:

  • 独立于文件当前偏移

  • 允许超出文件长度(返回 io.EOF

  • 重要错误:

    • ESPIPE:管道或不可定位

    • EINVAL:偏移为负

4.1.9 func (f *File) WriteAt(b []byte, off int64) (n int, err error)

​功能​​:向指定位置写入(不影响偏移) ​​参数​​:

  • b:数据

  • off:写入位置 ​​返回值​​:同 Write

注意事项​​:

  • 如果 off > 文件大小,会扩展文件(空洞)

  • 不支持管道、终端等特殊文件

4.1.10 func (f *File) Seek(offset int64, whence int) (ret int64, err error)

​功能​​:改变读写位置 ​​参数​​:

  • offset:偏移量

  • whence:基准位置(0=起始,1=当前,2=末尾) ​​返回值​​:

  • ret:新位置

  • err:错误

注意事项​​:

  • whence 使用 io 包常量:

    • io.SeekStart

    • io.SeekCurrent

    • io.SeekEnd

  • 返回的新位置可用于验证

  • 重要错误:

    • EINVAL:无效基准或偏移

    • ESPIPE:不可定位

4.1.11 func (f *File) Chmod(mode FileMode) error

​功能​​:修改文件权限 ​​参数​​:

  • mode:新权限位(如 0644) ​​返回值​​:错误对象

4.1.12 func (f *File) Chown(uid, gid int) error

​功能​​:修改文件所有者和组 ​​参数​​:

  • uid:用户ID(-1 表示不变)

  • gid:组ID(-1 表示不变) ​​返回值​​:错误对象

4.1.13 func (f *File) Stat() (FileInfo, error)

​功能​​:获取文件元数据 ​​返回值​​:

  • FileInfo:文件信息接口

  • error:错误对象

注意事项​​:

  • 信息缓存于文件打开时

  • 重要错误:

    • EBADF:文件描述符无效

    • ENOENT:文件被删除

4.1.14 func (f *File) Truncate(size int64) error

​功能​​:截断/扩展文件 ​​参数​​:

  • size:目标文件大小 ​​返回值​​:错误对象

4.1.15 func (f *File) Chdir() error

​功能​​:切换到文件所在目录(需为目录) ​​返回值​​:错误对象

4.1.16 func (f *File) ReadDir(n int) ([]DirEntry, error)

​功能​​:读取目录内容 ​​参数​​:

  • n:最多返回条目数(≤0 表示全部) ​​返回值​​:

  • []DirEntry:目录条目切片

  • error:错误对象

注意事项​​:

  • 高效实现(不加载完整信息)

  • 返回顺序取决于文件系统

  • 重要错误:

    • EBADF:文件不是目录

    • ENOTDIR:文件描述符无效

4.1.17 func (f *File) Sync() error

​功能​​:同步文件内容到磁盘 ​​返回值​​:错误对象

注意事项​​:

  • 确保数据写入持久化存储

  • 可能影响性能

  • 重要错误:

    • EIO:I/O错误

    • EROFS:只读文件系统

4.1.18 func (f *File) Fd() uintptr

​功能​​:获取底层文件描述符 ​​返回值​​:文件描述符

注意事项​​:

  • 描述符在文件关闭后失效

  • 破坏跨平台性

  • 可用于设置非阻塞模式等

4.1.19 func (f *File) SyscallConn() (syscall.RawConn, error)

​功能​​:获取原始连接对象 ​​返回值​​:

  • RawConn:原始连接接口

  • error:错误对象

注意事项​​:

  • 可执行自定义系统调用

  • 高级用户功能

  • 需要理解底层系统机制

4.1.20 func (f *File) SetDeadline(t time.Time) error

​功能​​:设置读写操作的绝对截止时间 ​​返回值​​:错误对象

适用于网络文件系统​​:

注意事项​​:

  • 同时影响读写操作

  • 适用于网络/管道文件

  • 重要错误:

    • ENOTSOCK:文件不是套接字

4.1.21 func (f *File) Name() string

功能​​:获取文件名(打开时的路径) ​​返回值​​:文件名

注意事项​​:

  • 可能为相对路径

  • 文件移动或重命名后不变

  • 不保证文件仍存在

4.1.22 func (f *File) Close() error

​功能​​:关闭文件 ​​返回值​​:错误对象(通常为 nil)

注意事项​​:

  • 必须调用以释放资源

  • 多次关闭可能导致 panic

  • 关闭后所有操作失败

4.2 FileInfo接口

4.2.1 func Stat(name string) (FileInfo, error)

功能​​:获取文件详细信息(​​跟随符号链接​​) ​​返回值​​:

  • FileInfo:文件信息对象

  • error:错误信息(通常是*PathError类型)

4.2.2 func Lstat(name string) (FileInfo, error)

功能​​:获取文件信息(​​不跟随符号链接​​) ​​返回值​​:

  • FileInfo:文件信息对象(符号链接自身)

  • error:错误信息(通常是*PathError类型)

4.3 DirEntry接口

4.3.1 func ReadDir(name string) ([]DirEntry, error)

  • 功能:跟 File.ReadDir 方法一致。

4.3.2 DirEntry与FileInfo对比

​特性​

​DirEntry​

​FileInfo​

​核心目的​

快速目录遍历优化

完整文件元数据表示

​设计目标​

最小化系统开销

提供完整文件信息

​获取成本​

⚡ 低成本(通常不需要额外系统调用)

⚠️ 高成本(可能需要单独系统调用)

​实现来源​

目录读取操作(如 readdir)

文件状态获取(如 stat、fstat)

​主要方法​

Name(), IsDir(), Type(), Info()

Name(), Size(), Mode(), ModTime()

​使用场景​

批量目录列表、递归遍历

文件详情展示、权限检查、大小统计

​扩展功能​

可延迟加载完整信息

包含系统特定数据(Sys()方法)

​性能影响​

✅ 高效(避免不必要的系统调用)

❌ 可能显著影响性能

4.4 FileMode类型

FileMode是Go语言中表示文件模式和权限的核心类型。

4.4.1 核心特性

  1. ​跨平台一致性​​:所有系统使用相同的位定义

  2. ​位掩码组合​​:通过位运算组合多种属性

  3. ​目录强制要求​​:ModeDir位唯一所有平台必需的标志位

  4. ​权限独立​​:权限位在所有系统有效

常量
值 (八进制)
描述
典型示例

ModeDir

040000

目录

/usr/bin

ModeAppend

020000000000

只追加模式

日志文件

ModeExclusive

020000000000

独占使用

数据库文件

ModeTemporary

010000000000

临时文件

*.tmp

ModeSymlink

0120000

符号链接

快捷方式

ModeDevice

0060000

设备文件

/dev/sda

ModeNamedPipe

0010000

命名管道

IPC管道

ModeSocket

0140000

Unix域套接字

/var/run/docker.sock

ModeSetuid

0004000

SetUID位

/usr/bin/passwd

ModeSetgid

0002000

SetGID位

/usr/bin/wall

ModeSticky

0001000

粘滞位

/tmp

ModeCharDevice

0020000

字符设备

/dev/tty

ModeIrregular

0100000

非常规文件

特殊文件

4.5 ProAttr类型

ProcAttr 是 Go 语言中用于控制新进程创建的关键结构体,包含子进程的配置信息:

  1. Dir:工作目录控制

    • 设置后改变 os.Getwd() 结果

    • 路径不存在时启动失败

    • Windows 路径格式敏感

  2. Env:环境变量定制

  3. Files:文件句柄继承

4.6 Process类型

os.Process 类型表示一个正在运行或已经退出的操作系统进程。它包含了该进程的信息以及用于操作该进程的方法。

4.6.1 FindProcess(pid int) (*Process, error)

​功能​​:根据进程ID查找现有进程 ​​参数​​:

  • pid:目标进程ID(PID)

​返回值​​:

  • *Process:进程对象指针

  • error:错误信息

​关键特性​​:

  • Unix系统:即使进程不存在也可能返回对象(需配合Signal验证)

  • Windows系统:无效PID直接返回错误

  • 权限要求:需有权限操作目标进程

4.6.2 StartProcess(name string, argv []string, attr *ProcAttr) (*Process, error)

功能​​:启动新进程 ​​参数​​:

  • name:可执行文件路径

  • argv:命令行参数(argv[0]通常为程序名)

  • attr:进程属性配置

​返回值​​:

  • *Process:新启动的进程对象

  • error:启动错误

​关键特性​​:

  • 与父进程环境隔离

  • 文件句柄自动继承(仅限attr.Files指定)

  • 跨平台支持不同执行策略

4.6.3 Kill() error

​功能​​:立即强制终止进程(SIGKILL/TerminateProcess) ​​返回值​​:操作错误

​关键特性​​:

  • Unix: 发送SIGKILL信号

  • Windows: 调用TerminateProcess API

  • 无资源清理,强制终止

4.6.4 Release() error

​功能​​:释放进程资源,不影响进程运行 ​​返回值​​:操作错误

​关键特性​​:

  • 仅释放父进程持有的资源

  • 不会终止目标进程

  • 调用后无法再操作此进程

4.6.5 Signal(sig Signal) error

​功能​​:向进程发送指定信号 ​​参数​​:

  • sig:要发送的信号

​返回值​​:操作错误

​关键特性​​:

  • Unix: 支持所有标准POSIX信号

  • Windows: 仅支持特定信号:

    • os.Interrupt (Ctrl+C)

    • os.Kill (强制终止)

  • 需目标进程可接收信号

4.6.6 Wait() (*ProcessState, error)

​功能​​:等待进程结束并返回状态 ​​返回值​​:

  • *ProcessState:进程结束状态

  • error:等待错误

​关键特性​​:

  • 阻塞调用直到进程退出

  • 自动释放进程资源

  • 对每个进程应调用且仅调用一次

4.7 ProcessState

os.ProcessState 类型表示一个已退出进程的状态信息,它由Process.Wait方法返回。

4.8 Signal接口

该接口表示操作系统信号。通常,底层的实现是依赖于操作系统的:在Unix系统上,它是 syscall.Signal 类型。

  • 预定义常量

4.9 Root类型

Root 类型是 Go 1.24 引入的文件系统安全隔离机制,用于​​限制访问仅限于单一目录树​​,增强了应用的文件系统操作安全性。

设计特点

  1. ​单目录树限制​​:所有操作限制在根目录下

  2. ​符号链接保护​​:允许符号链接但禁止引用根目录外

  3. ​并发安全​​:多个 goroutine 可安全调用

  4. ​路径逃逸防护​​:组件路径外引用导致错误

  5. ​平台特定行为​​:不同系统有不同限制

​函数/方法名​

​声明​

​作用​

​实现细节​

​参数说明​

​返回值​

​注意事项​

​OpenRoot​

func OpenRoot(name string) (*Root, error)

打开指定目录作为安全操作的根对象

创建文件描述符/句柄,锁定目录位置

name string: 目录路径

*Root: 根对象 error: 错误对象

错误情况: - ErrNotExist:目录不存在 - ErrPermission:权限不足 - Windows:拒绝保留设备名(NUL/COM1等)

​Close​

func (r *Root) Close() error

关闭并释放根对象资源

释放文件描述符/句柄,标记为关闭状态

error: 关闭错误

关闭后所有操作返回错误 应使用 defer 确保释放资源

​Create​

func (r *Root) Create(name string) (*File, error)

在根下创建文件(截断存在文件)

调用 OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666)

name string: 相对路径

*File: 文件对象 error: 错误对象

路径检查: 1. 禁止 ../ 逃逸 2. 符号链接必须在根内 Windows:过滤保留设备名

​FS​

func (r *Root) FS() fs.FS

获取根目录的只读文件系统接口

返回实现 fs.StatFS, fs.ReadFileFS, fs.ReadDirFS 的结构体

fs.FS: 只读文件系统

不支持写操作 兼容 io/fs 生态系统

​Lstat​

func (r *Root) Lstat(name string) (FileInfo, error)

获取文件元数据(不解引用符号链接)

通过 syscall.Lstat 实现

name string: 相对路径

FileInfo: 文件信息 error: 错误对象

符号链接:返回链接自身信息 边界检查: - 路径必须在根下 - 符号链接目标不验证

​Mkdir​

func (r *Root) Mkdir(name string, perm FileMode) error

创建子目录

调用 syscall.Mkdir,权限受 umask 影响

name string: 目录路径 perm FileMode: 权限位

error: 错误对象

权限限制: 仅允许低9位权限位(0o777) 错误: - EEXIST: 目录已存在 - EPERM: 权限不足

​Name​

func (r *Root) Name() string

获取根目录原始路径

返回 OpenRoot() 输入的路径字符串

string: 根目录路径

关闭后仍可调用 返回值未规范化 Windows:保留大小写原始输入

​Open​

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

以只读方式打开文件

调用 OpenFile(name, O_RDONLY, 0)

name string: 相对路径

*File: 文件对象 error: 错误对象

仅支持读取 打开目录会成功但后续读取失败 路径必须存在于根下

​OpenFile​

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

完整控制的文件打开

包含所有标准打开标志

name string: 相对路径 flag int: 打开标志 perm FileMode: 权限位

*File: 文件对象 error: 错误对象

权限限制: 仅允许低9位权限位 标志兼容性: 支持所有标准 os.OpenFile 标志

​OpenRoot​

func (r *Root) OpenRoot(name string) (*Root, error)

在现有根下打开子目录作为新根

类似 OpenRoot 但使用相对路径

name string: 子目录路径

*Root: 新根对象 error: 错误对象

深度限制: 最多允许32层嵌套 目标必须存在且为目录 Plan9:不跟踪目录重命名

​Remove​

func (r *Root) Remove(name string) error

删除文件或空目录

调用 syscall.Unlinksyscall.Rmdir

name string: 相对路径

error: 错误对象

限制: - 不能删除非空目录 - 符号链接删除链接自身 错误: - ENOTEMPTY:目录非空

​Stat​

func (r *Root) Stat(name string) (FileInfo, error)

获取文件元数据(解引用符号链接)

通过 syscall.Stat 实现

name string: 相对路径

FileInfo: 文件信息 error: 错误对象

与Lstat区别: 返回目标文件信息 安全注意: 可访问符号链接指向的根外文件(但被系统阻止)

最后更新于