Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > go语言os包用法

go语言中os包的用法实战大全

作者:才华横溢caozy

Go在os中提供了文件的基本操作,包括通常意义的打开、创建、读写等操作,除此以外为了追求便捷以及性能上,Go还在io/ioutil以及bufio提供一些其他函数供开发者使用,这篇文章主要给大家介绍了关于go语言中os包用法的相关资料,需要的朋友可以参考下

前言

Go语言中的os包是操作系统包,提供了丰富的函数和方法用于与操作系统进行交互。本文将介绍一些常用的os包函数和方法,包括文件操作、进程管理、环境变量管理等。

一、文件权限符号

介绍os包之前我们先介绍一下文件权限。

1.1、定义

在 Golang 中,文件权限由三组数字表示,分别表示文件所有者、组成员和其他用户。每组数字由三个数字组成,分别表示读、写和执行权限。数字 0 表示没有权限,数字 4 表示有读权限,数字 2 表示有写权限,数字 1表示有执行权限。

因此,0666 表示所有用户都有读、写权限。

以下是文件权限的完整表格:

权限所有者组成员其他用户
444
222
执行111

1.2、POSIX标准

POSIX(Portable Operating System Interface for Unix)是一种定义了操作系统交互接口的标准,旨在确保在不同操作系统上的程序具有一致的行为。在POSIX标准中,文件权限通常以八进制数字表示,并且在数字前面加上一个"0"。
因此,为了遵循POSIX标准并与其他系统兼容,Go语言中的os.Stat函数将文件权限设置为0666而不是直接使用666。这样可以确保在不同的操作系统上都能正确地解析和处理文件权限。

三、os包

3.1、获取文件/文件夹信息

Stat(name string) (FileInfo, error)
Lstat(name string) (FileInfo, error)
IsExist(err error) bool // 指示是否已知错误以报告文件或目录已存在。
IsNotExist(err error) bool // 是否已知错误以报告文件或目录不存在。
IsPermission(err error) bool // 是否已知错误以报告权限被拒绝。
IsTimeout(err error) bool // 是否已知错误以报告发生了超时。
NewSyscallError(syscall string, err error) error // 以错误的形式返回一个新的 SyscallError,包含给定的系统调用名称和错误详细信息
//如果传入的是一个符号链接,那么Lstat只返回该符号链接,不会跟踪,其他没区别。

返回FileInfo对象和error,如果报错说明传入的路径不合法/不存在。FileInfo对象包含文件的一些信息:

// FileInfo 描述一个文件,由 Stat 返回。
type FileInfo interface {
	Name() string       // 文件的基本名称
	Size() int64        // 常规文件的长度(以字节为单位);系统依赖于他人
	Mode() FileMode     // 文件模式位
	ModTime() time.Time // 修改时间
	IsDir() bool        // Mode().IsDir()的缩写。
	Sys() any           // 基础数据源(可以返回nil)
}

3.1.1、测试

package main

import (
	"fmt"
	"os"
)

func main() {
	path := "D:/config/test/test.txt"
	stat, _ := os.Stat(path)
	fmt.Println("stat.Name():", stat.Name())
	fmt.Println("stat.Size():", stat.Size())
	fmt.Println("stat.Mode():", stat.Mode())
	fmt.Println("stat.ModTime():", stat.ModTime())
	fmt.Println("stat.IsDir():", stat.IsDir())
	fmt.Println("stat.Sys():", stat.Sys())
}

3.1.2、输出

stat.Name(): test.txt
stat.Size(): 0                                                                         
stat.Mode(): -rw-rw-rw-                                                                
stat.ModTime(): 2023-12-19 10:26:07.3735891 +0800 CST                                  
stat.IsDir(): false                                                                    
stat.Sys(): &{32 {3102608083 31076898} {3102608083 31076898} {3102608083 31076898} 0 0}

3.2、创建文件

Create

Create(name string) (*File, error)   // 创建文件,文件存在则覆盖,底层调用的是OpenFile

返回*File指针对象和error,使用File对象,可以对文件进行读写操作。

CreateTemp

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

3.3、打开文件

Open(name string) (*File, error)  //以只读方式打开文件
OpenFile(name string, flag int, perm FileMode) (*File, error) // 打开或创建文件

Open方法

OpenFile方法

文件操作方式 中文释义 注意事项
O_RDONLY 只读 不能和O_WRONLY、O_RDWR一起使用
O_WRONLY 只写 不能和O_RDONLY、O_RDWR一起使用
O_RDWR 读写 不能和O_WRONLY、O_WRONLY一起使用
O_APPEND 追加 和上边三个之一进行或运算传值,创建文件时,如果文件存在,则不会覆盖
O_CREATE 创建 和上边三个之一进行或运算传值
O_EXCL 强制 与 O_CREATE 一起使用时,文件不能存在
O_SYNC 同步 打开以进行同步I/O。
O_TRUNC 存在则覆盖 打开时截断常规可写文件。

3.3.1、测试

打开一个文件,如果文件不存在则创建,默认不会覆盖

path := "D:/config/test/test.txt"
	//打开文件,如果文件不存在,则创建
	file, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
	if err != nil {
		fmt.Println("创建文件失败:", err)
		return
	}
	fmt.Println(file)

3.4、写文件

WriteFile(name string, data []byte, perm FileMode) error
//写文件,底层调用OPenFile,以只写方式打开文件,如果文件存在,则覆盖,不存在则创建

3.5、读文件

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

3.6、移动/重命名文件/目录

Rename(oldpath, newpath string) error

3.7、删除文件或目录

Remove(name string) error // 删除文件
RemoveAll(path string) error //删除目录
// 删除路径及其包含的所有子路径。它会删除它能删除的所有内容,不存在不会报错

不存在会报错

3.8、创建目录

Mkdir

Mkdir(name string, perm FileMode) error

MkdirAll

MkdirAll(path string, perm FileMode) error

创建临时目录-MkdirTemp

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

3.9、更改文件/目录权限

Chmod(name string, mode FileMode) error

3.10、获取文件系统fs对象

DirFS(dir string) fs.FS

3.11、获取目录下的所有文件

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

返回的DirEntry对象如下:

// DirEntry 是从目录读取的条目(使用 ReadDir
// 函数或 ReadDirFile 的 ReadDir 方法)
type DirEntry interface {
	// Name 返回条目所描述的文件(或子目录)的名称。此名称只是路径的最后一个
	// 元素(基本名称),而不是整个路径。例如,name将返回“hello.go”,
	// 而不是“ home/gopher/hello.go ”。
	Name() string

	// IsDir 报告条目是否描述目录。
	IsDir() bool

	// Type 返回条目的类型位。类型位是由 FileMode.Type
	// 方法返回的常见 FileMode 位的子集。
	Type() FileMode

	// Info 返回条目所描述的文件或子目录的 FileInfo。
	// 返回的 FileInfo 可以是读取原始目录的时间,也可
	// 以是调用 Info 的时间。如果文件在目录读取后已被删除或重
	// 命名,则 Info 可能会返回满足 errors.is(err,ErrNotExist)的错误。
	// 如果条目表示符号链接,
	// 则 Info 报告有关链接本身的信息,而不是链接的目标
	Info() (FileInfo, error)
}

测试

func main() {
	path := "D:\\software"
	dir, err := os.ReadDir(path)
	if err != nil {
		fmt.Println(err)
		return
	}
	for i := 0; i < len(dir); i++ {
		fmt.Println(dir[i].Name())
		fmt.Println(dir[i].IsDir())
		fmt.Println(dir[i].Info())
		fmt.Println(dir[i].Type())
	}
}

3.12、修改文件大小

Truncate(name string, size int64) error

更改命名文件的大小。如果文件是符号链接,它会更改链接目标的大小。

3.13、其他功能函数

3.14、进程/环境变量相关

三、总结

os包是Go语言标准库中提供的一种操作系统抽象接口,它提供了丰富的函数和方法来访问和操作系统相关的功能。

总之,os包是Go语言中非常重要的一个标准库,它提供了丰富的函数和方法来访问和操作系统相关的功能。掌握这些用法可以帮助我们更加高效地编写程序,并且能够更好地处理与操作系统相关的问题。

到此这篇关于go语言中os包用法的文章就介绍到这了,更多相关go语言os包用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文