go---使用 os 包中的API

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)
}	

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值