os 包能做什么
Go 的 os 包提供了与操作系统交互的功能,包括文件系统操作、环境变量、进程管理等。
1. 文件操作
File类型File类型表示打开的文件,提供了多种文件操作方法,如读写、关闭文件等。gopackage os type File struct { // contains filtered or unexported fields }- 方法:
Read(p []byte) (n int, err error):从文件中读取数据。Write(p []byte) (n int, err error):向文件中写入数据。Close() error:关闭文件。Seek(offset int64, whence int) (int64, error):设置文件的当前位置。Stat() (FileInfo, error):获取文件信息。Truncate(size int64) error:截断文件。
示例:
gopackage main import ( "fmt" "os" ) func main() { file, err := os.Create("example.txt") if err != nil { fmt.Println("Error creating file:", err) return } defer file.Close() file.Write([]byte("Hello, File!")) file.Seek(0, 0) buf := make([]byte, 12) file.Read(buf) fmt.Println("File contents:", string(buf)) }- 方法:
文件操作函数
os.Create(name string) (*File, error):创建一个新文件,如果文件已存在则截断文件。os.Open(name string) (*File, error):打开一个文件以进行读取。os.OpenFile(name string, flag int, perm FileMode) (*File, error):打开一个文件,具有更多控制选项。os.Remove(name string) error:删除一个文件。os.Rename(oldpath, newpath string) error:重命名文件或移动文件。os.Mkdir(name string, perm FileMode) error:创建目录。os.MkdirAll(path string, perm FileMode) error:递归创建目录。os.Remove(name string) error:删除文件或空目录(删除非空目录用os.RemoveAll)。
示例:
gopackage main import ( "fmt" "os" ) func main() { // Create a file file, err := os.Create("example.txt") if err != nil { fmt.Println("Error creating file:", err) return } file.Close() // Remove the file err = os.Remove("example.txt") if err != nil { fmt.Println("Error removing file:", err) return } // Create a directory err = os.Mkdir("exampleDir", 0755) if err != nil { fmt.Println("Error creating directory:", err) return } // Remove the directory err = os.Remove("exampleDir") if err != nil { fmt.Println("Error removing directory:", err) return } }
2. 环境变量
Getenv(key string) string获取指定环境变量的值。
gopackage main import ( "fmt" "os" ) func main() { homeDir := os.Getenv("HOME") fmt.Println("HOME:", homeDir) }Setenv(key, value string) error设置环境变量的值。
gopackage main import ( "fmt" "os" ) func main() { err := os.Setenv("MY_VAR", "my_value") if err != nil { fmt.Println("Error setting environment variable:", err) return } value := os.Getenv("MY_VAR") fmt.Println("MY_VAR:", value) }Unsetenv(key string) error删除指定环境变量。
gopackage main import ( "fmt" "os" ) func main() { os.Setenv("MY_VAR", "my_value") os.Unsetenv("MY_VAR") value := os.Getenv("MY_VAR") fmt.Println("MY_VAR:", value) }
3. 进程管理
exec.Command(name string, arg ...string) *Cmd创建一个用于执行命令的
Cmd对象(位于os/exec包)。gopackage main import ( "fmt" "os/exec" ) func main() { cmd := exec.Command("echo", "Hello, World!") output, err := cmd.Output() if err != nil { fmt.Println("Error executing command:", err) return } fmt.Println(string(output)) }Cmd类型Cmd类型表示一个外部命令的执行,提供了控制外部进程的功能。gopackage exec type Cmd struct { // contains filtered or unexported fields }- 方法:
Run() error:运行命令并等待其完成。Start() error:启动命令,但不等待其完成。Wait() error:等待命令完成。
- 方法:
Getpid() int返回当前进程的 PID。
gopackage main import ( "fmt" "os" ) func main() { fmt.Println("Current PID:", os.Getpid()) }Kill() error发送信号终止进程(
os.Process的方法)。gopackage main import ( "fmt" "os" ) func main() { pid := os.Getpid() fmt.Println("Current PID:", pid) // 终止进程需要先拿到 *os.Process,再调用其 Kill 方法: // p, err := os.FindProcess(pid) // if err == nil { // err = p.Kill() // } }
4. 文件信息
FileInfo接口FileInfo接口提供了文件的基本信息。gopackage os import "time" type FileMode uint32 type FileInfo interface { Name() string Size() int64 Mode() FileMode ModTime() time.Time IsDir() bool Sys() interface{} }- 方法:
Name() string:文件名。Size() int64:文件大小(字节)。Mode() FileMode:文件模式(权限)。ModTime() time.Time:文件的最后修改时间。IsDir() bool:是否是目录。Sys() interface{}:系统相关信息。
- 方法:
FileMode类型FileMode表示文件的权限和模式。gopackage os type FileMode uint32打开文件时常用的 flag 常量(作为
os.OpenFile的flag参数,类型为 int):os.O_RDONLY:只读模式。os.O_WRONLY:只写模式。os.O_RDWR:读写模式。os.O_CREATE:如果文件不存在则创建。os.O_TRUNC:截断文件。os.O_APPEND:追加写入。
FileMode自身的常用常量:os.ModeDir:目录。os.ModePerm:Unix 权限位掩码(0777)。os.ModeSymlink:符号链接。
示例:
gopackage main import ( "fmt" "os" ) func main() { file, err := os.Stat("example.txt") if err != nil { fmt.Println("Error getting file info:", err) return } fmt.Println("File Name:", file.Name()) fmt.Println("File Size:", file.Size()) fmt.Println("File Mode:", file.Mode()) fmt.Println("Last Modified Time:", file.ModTime()) fmt.Println("Is Directory:", file.IsDir()) }
5. 文件路径处理
Join(elem ...string) string将多个路径元素连接成一个路径。
gopackage path func Join(elem ...string) string示例:
gopackage main import ( "fmt" "path" ) func main() { fullPath := path.Join("folder", "subfolder", "file.txt") fmt.Println("Full Path:", fullPath) }Abs(path string) (string, error)获取路径的绝对路径(位于
path/filepath包)。gopackage filepath func Abs(path string) (string, error)示例:
gopackage main import ( "fmt" "path/filepath" ) func main() { absPath, err := filepath.Abs("example.txt") if err != nil { fmt.Println("Error getting absolute path:", err) return } fmt.Println("Absolute Path:", absPath) }Base(path string) string返回路径中的最后一个元素(文件名或目录名)。
gopackage path func Base(path string) string示例:
gopackage main import ( "fmt" "path" ) func main() { baseName := path.Base("/folder/subfolder/file.txt") fmt.Println("Base Name:", baseName) }Dir(path string) string返回路径中的目录部分。
gopackage path func Dir(path string) string示例:
gopackage main import ( "fmt" "path" ) func main() { dirName := path.Dir("/folder/subfolder/file.txt") fmt.Println("Directory Name:", dirName) }
总结
os 包按三块分工:文件用 File 的 Read、Write、Close 加 os.Create、os.OpenFile 这组函数;环境变量是 Getenv、Setenv、Unsetenv;进程是 exec.Command 和 os.Getpid。路径拼接归 path 和 path/filepath 管。