os 包中提供平台不相关的 API。
os.File 操作文件的方式
package main
import (
"fmt"
"os"
"path/filepath"
"syscall"
)
func main() {
// os.Create: 根据给定的路径创建一个新的文件
// 返回一个 File 值和一个错误值
// 在返回的 File 值上可对相应的文件进行读写操作
// 如果在给定文件存在,则清空文件中的内容并将它作为第一个结果值返回
fileName := "something1.txt"
filePath1 := filepath.Join(os.TempDir(), fileName)
var paths []string
paths = append(paths, filePath1)
dir, _ := os.Getwd()
paths = append(paths, filepath.Join(dir[:len(dir)], fileName))
for _, path := range paths {
fmt.Printf("Create a file with path %s ...\n", path)
_, err := os.Create(path)
if err != nil {
var underlyingErr string
if _, ok := err.(*os.PathError); ok {
underlyingErr = "(path error)"
}
fmt.Printf("error: %v %s\n", err, underlyingErr)
continue
}
fmt.Println("The file has been created.")
}
fmt.Println()
// os.NewFile: 根据一个已经存在的文件描述符,新建一个包装了该文件的 File 值
// 参数为代表文件描述符的 uintptr 类型的值,一个表示文件名的字符串
fmt.Println("New a file associated with stderr ...")
file3 := os.NewFile(uintptr(syscall.Stderr), "/dev/stderr") // 返回包装了标准错误输出的 File
if file3 != nil {
file3.WriteString("The Go language program writes somthing to stderr.\n")
}
fmt.Println()
// Open: 以只读模式打开一个文件并返回包装了该文件的 File 值
fmt.Printf("Open a file with path %s ...\n", filePath1)
file4, err := os.Open(filePath1)
if err != nil {
fmt.Printf("error: %v\n", err)
return
}
fmt.Println("Write something to the file ...")
_, err = file4.WriteString("something") // 不能写入
var underlyingErr string
if _, ok := err.(*os.PathError); ok {
underlyingErr = "(path error)"
}
fmt.Printf("error: %v %s\n", err, underlyingErr)
fmt.Println()
// os.OpenFile: 是 os.Create 和 os.Open 函数的底层支持,最为灵活
// 参数为 name, flag, perm,分别为文件路径,读写模式,权限模式
fmt.Printf("Reuse a file on path %s ...\n", filePath1)
file6, err := os.OpenFile(filePath1, os.O_WRONLY|os.O_TRUNC, 0666)
if err != nil {
fmt.Printf("error: %v\n", err)
return
}
contents := "something"
fmt.Printf("Write %q to the file ...\n", contents)
n, err := file6.WriteString(contents)
if err != nil {
fmt.Printf("error: %v\n", err)
} else {
fmt.Printf("The number of bytes written is %d.\n", n)
}
}
File 值的读写模式与权限
package main
import (
"fmt"
"os"
"path/filepath"
)
func main() {
fileName1 := "something2.txt"
filePath1 := filepath.Join(os.TempDir(), fileName1)
fmt.Println("Try to create an existing file with flag os.O_TRUNC ...")
// 第 2 个参数:读写|文件不存在时创建|文件存在时清空
// 第 3 个参数:访问权限:32 个比特位中
// 高 21 个比特位:最高比特位上的二进制数是 1,表示的文件模式等同于 os.ModeDir,即目录
// 低 9 个比特位:文件的权限,每 3 个比特位为一组,共 3 组,从高到低依次为文件所有者、
// 文件所有者所属的用户组、其它用户对该文件的访问权限
// 每组中,其中的 3 个比特位从高到低依次为读、写、执行权限
// 0666则表示:所有用户都对当前文件有读和写的权限,但都没有执行权限
file2, err := os.OpenFile(filePath1, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)
if err != nil {
fmt.Printf("error: %v\n", err)
return
}
fmt.Printf("The file descriptor: %d\n", file2.Fd())
fmt.Println("Try to create an existing file with flag os.O_EXCL ...")
// 读写|文件不存在时创建|给定路径上不能有已存在文件
_, err = os.OpenFile(filePath1, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0666)
fmt.Printf("error: %v\n", err)
}