非零基础自学Golang 第11章 文件操作 11.2 文件基本操作 11.2.1 文件创建与打开

非零基础自学Golang

第11章 文件操作

11.2 文件基本操作

在学习文件操作之前,我们先来了解一下Linux下的文件权限。

文件有三种权限,分别为读取、写入和执行,对应字母为r、w、x。

Linux下权限的粒度有拥有者、所属组、其他组三种。

每个文件都可以针对三种粒度,设置不同的rwx(读、写、执行)权限。通常情况下,一个文件只能归属于一个用户和组,如果其他的用户想拥有这个文件的权限,则可以将该用户加入具备权限的群组,一个用户可以同时归属于多个组。

在这里插入图片描述

在创建一个文件或文件夹时,我们通常会赋予这个文件一定的权限。例如777权限就代表给这个文件的拥有者、所属组、其他用户赋予的读写执行权限。【OK】

11.2.1 文件创建与打开

对于文件的创建与打开,使用的是标准库os中的OpenFile。

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

OpenFile是一个更底层的文件打开函数,大多数调用者都应用Open或Create代替本函数。

它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是*PathError。

位掩码参数flag用于指定文件的访问模式,可用的值在os中定义为常量(以下值并非所有操作系统都可用):

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 // 如果可能,打开时清空文件
)

其中,O_RDONLY、O_WRONLY、O_RDWR应该只指定一个,剩下的通过“|”操作符来指定。该函数内部会给flags加上syscall.O_CLOEXEC,在fork子进程时会关闭通过OpenFile打开的文件,即子进程不会重用该文件描述符。

【提示】

由于历史原因,O_RDONLY | O_WRONLY并非等于O_RDWR,它们的值一般是0、1、2。

位掩码参数perm指定了文件的模式和权限位,类型是os.FileMode,文件模式位常量定义在os中:

const (
 	// 单字符是被 String 方法用于格式化的属性缩写
 	ModeDir FileMode = 1 << (32 - 1 - iota) // d: 目录
 	ModeAppend // a: 只能写入,且只能写入到末尾
 	ModeExclusive // l: 用于执行
 	ModeTemporary // T: 临时文件(非备份文件)
 	ModeSymlink // L: 符号链接(不是快捷方式文件)
 	ModeDevice // D: 设备
 	ModeNamedPipe // p: 命名管道(FIFO)
 	ModeSocket // S: Unix域socket
 	ModeSetuid // u: 表示文件具有其创建者用户id权限
 	ModeSetgid // g: 表示文件具有其创建者组id的权限
 	ModeCharDevice // c: 字符设备,需已设置ModeDevice
 	ModeSticky // t: 只有root/创建者能删除/移动文件
 
 	// 覆盖所有类型位(用于通过&获取类型位),对普通文件,所有这些位都不应被设置
 	ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice
 	ModePerm FileMode = 0777 // 覆盖所有Unix权限位(用于通过&获取类型位)
)

以上常量在所有操作系统都有相同的含义,因此文件的信息可以在不同的操作系统之间安全地移植。

[ 动手写 11.2.1]

package main

import (
   "fmt"
   "os"
)

func main() {

   // 以读写方式打开文件,如果不存在,则创建
   file, err := os.OpenFile("C:\\Windows\\Temp\\1.txt", os.O_RDWR|os.O_CREATE, 0766)

   if err != nil {
      fmt.Println(err)
   }
   fmt.Println(file)
   file.Close()
}

运行结果

在这里插入图片描述

动手写11.2.1中,“os.O_RDWR|os.O_CREATE”表示以读写方式打开文件,如果文件不存在,则创建这个文件。

大多数情况下,我们会使用如下两个函数来创建或打开文件。

func Open(name string) (file *File, err error)

Open打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY模式。如果出错,错误底层类型是*PathError。

func Create(name string) (file *File, err error)

Create采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件,如果文件已存在就会截断它(为空文件)。如果成功,返回的文件对象可用于I/O;对应的文件描述符具有O_RDWR模式。如果出错,错误底层类型是*PathError。

Open和Create的函数定义如下:

func Open(name string) (*File, error) {
 	return OpenFile(name, O_RDONLY, 0)
}

func Create(name string) (*File, error) {
 	return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ding Jiaxiong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值