参考https://studygolang.com/pkgdoc

导入方式:

  1. import "os"

os包提供了操作系统函数的不依赖平台的接口

一开始简单举个例子:

  1. package main
  2. import(
  3. "fmt"
  4. "os"
  5. "log"
  6. )
  7. func main() {
  8. file, err := os.Open("test.txt")
  9. if err != nil{
  10. log.Fatal(err)
  11. }
  12. data := make([]byte, )
  13. count, err := file.Read(data)
  14. if err != nil {
  15. log.Fatal(err)
  16. }
  17. fmt.Printf("read %d bytes: %q\n", count, data[:count])
  18. }

因为没有file.txt这个文件,所以会返回:

  1. userdeMBP:go-learning user$ go run test.go
  2. // :: open test.txt: no such file or directory
  3. exit status

在当前目录生成一个test.txt文件:

  1. hello
  2. what do you want
  3. no thanks

然后再运行返回:

  1. userdeMBP:go-learning user$ go run test.go
  2. read bytes: "hello\nwhat do you want\nno thanks"

1.const常量

1)

  1. const (
  2. O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
  3. O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
  4. O_RDWR int = syscall.O_RDWR // 读写模式打开文件
  5. O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
  6. O_CREATE int = syscall.O_CREAT // 如果不存在将创建一个新文件
  7. O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必须不存在
  8. O_SYNC int = syscall.O_SYNC // 打开文件用于同步I/O
  9. O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件
  10. )

作为参数flag传输,用于包装底层系统的参数,说明使用什么模式打开文件

Open()函数默认使用的是flag == O_RDONLY,即只读模式,相当于OpenFile(name,O_RDONLY,0)

但是不是所有flag都能在特定系统中使用的

1》func Open

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

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

2》func OpenFile

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

OpenFile是一个更一般性的文件打开函数,大多数调用者都应用Open或Create代替本函数。它会使用指定的选项(如O_RDONLY等)、指定的模式FileMode(如0666,即可读写,但是不可执行)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是*PathError。

参数flag可以结合使用:

  1. os.O_WRONLY | os.O_CREATE | O_EXCL //如果已经存在,则失败
  2. os.O_WRONLY | os.O_CREATE //如果已经存在,会覆盖写,不会清空原来的文件,而是从头直接覆盖写
  3. os.O_WRONLY | os.O_CREATE | os.O_APPEND //如果已经存在,则在尾部添加写

参数perm:

linux中的权限rwx分别对应4 2 1,相加的值为7。如0666,即可读写,但是不可执行

下面的例子设置为不可写,然后进行写操作时会出错:

  1. package main
  2. import(
  3. "fmt"
  4. "os"
  5. "log"
  6. )
  7. func main() {
  8. file, err := os.OpenFile("test.txt", os.O_RDONLY, ) //只可读、执行,不可写
  9. if err != nil{
  10. log.Fatal(err)
  11. }
  12. defer file.Close()
  13.  
  14. data1 := []byte("add something to test.txt")
  15. number, err := file.Write(data1)
  16. if err != nil{
  17. log.Fatal(err)
  18. }
  19. fmt.Printf("successfully add %d bytes: %q\n", number, data1[:number])
  20.  
  21. data := make([]byte, )
  22. count, err := file.Read(data)
  23. if err != nil {
  24. log.Fatal(err)
  25. }
  26. fmt.Printf("read %d bytes: %q\n", count, data[:count])
  27.  
  28. }

出错:

  1. userdeMBP:go-learning user$ go run test.go
  2. // :: write test.txt: bad file descriptor
  3. exit status

改权限:

  1. file, err := os.OpenFile("test.txt", os.O_RDWR | os.O_APPEND, ) //可读写,且写的内容添加在末尾

返回:

  1. userdeMBP:go-learning user$ go run test.go
  2. successfully add bytes: "add something to test.txt"
  3. // :: EOF
  4. exit status

返回EOF(end-of-file)的原因是上面的Write()运行完后指针指在文件终端,这个时候读取就读取不到数据

所以写完后想读应该重新调用一个Open():

  1. package main
  2. import(
  3. "fmt"
  4. "os"
  5. "log"
  6. )
  7. func main() {
  8. file, err := os.OpenFile("test.txt", os.O_RDWR | os.O_APPEND, ) //可读写,且写的内容添加在末尾
  9. if err != nil{
  10. log.Fatal(err)
  11. }
  12. defer file.Close()
  13.  
  14. data1 := []byte("add something to test.txt")
  15. number, err := file.Write(data1)
  16. if err != nil{
  17. log.Fatal(err)
  18. }
  19. fmt.Printf("successfully add %d bytes: %q\n", number, data1[:number])
  20.  
  21. file1, err := os.Open("test.txt") //只读
  22. data := make([]byte, )
  23. count, err := file1.Read(data)
  24. if err != nil {
  25. log.Fatal(err)
  26. }
  27. fmt.Printf("read %d bytes: %q\n", count, data[:count])
  28. defer file1.Close()
  29.  
  30. }

返回:

  1. userdeMBP:go-learning user$ go run test.go
  2. successfully add bytes: "add something to test.txt"
  3. read bytes: "hello\nwhat do you want\nno thanksadd something to test.txt"

3》func Create

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

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

  1. package main
  2. import(
  3. "fmt"
  4. "os"
  5. "log"
  6. )
  7. func main() {
  8. file, err := os.Create("testCreate.txt") //可读写,且写的内容添加在末尾
  9. if err != nil{
  10. log.Fatal(err)
  11. }
  12. defer file.Close()
  13.  
  14. data1 := []byte("write something to testCreate.txt")
  15. number, err := file.Write(data1)
  16. if err != nil{
  17. log.Fatal(err)
  18. }
  19. fmt.Printf("successfully write %d bytes: %q\n", number, data1[:number])
  20.  
  21. }

返回:

  1. userdeMBP:go-learning user$ ls
  2. hello.go test.go test.txt
  3. userdeMBP:go-learning user$ go run test.go
  4. successfully write bytes: "write something to testCreate.txt"
  5. userdeMBP:go-learning user$ ls
  6. hello.go test.go test.txt testCreate.txt

可见生成了一个testCreate.txt文件,并将相应的内容写入

2)

  1. const (
  2. SEEK_SET int = // 相对于文件起始位置seek
  3. SEEK_CUR int = // 相对于文件当前位置seek
  4. SEEK_END int = // 相对于文件结尾位置seek
  5. )

用于Seek(offset int64, whence int)函数,指定从何处开始搜索(即相对位置whence)

func (*File) Seek

  1. func (f *File) Seek(offset int64, whence int) (ret int64, err error)

Seek设置下一次读/写的位置。offset为相对偏移量,而whence决定相对位置:0为相对文件开头,1为相对当前位置,2为相对文件结尾。它返回新的偏移量(相对开头)和可能的错误。

举例说明:

  1. package main
  2. import(
  3. "fmt"
  4. "os"
  5. "log"
  6. )
  7. func main() {
  8. file, err := os.Open("test.txt")
  9. if err != nil {
  10. log.Fatal(err)
  11. }
  12. defer file.Close()
  13.  
  14. set_offset, _ := file.Seek(, os.SEEK_SET)//从文件的起始位置偏移5
  15. fmt.Println(set_offset)
  16.  
  17. data := make([]byte, )
  18. count, err := file.Read(data)
  19. if err != nil{
  20. log.Fatal(err)
  21. }
  22. fmt.Printf("Read %d bytes: %q\n", count, data[:count])
  23.  
  24. cur_offset, _ := file.Seek(, os.SEEK_CUR) //获得文件指针当前位置
  25. fmt.Println(cur_offset)
  26. }

返回:

  1. userdeMBP:go-learning user$ go run test.go
  2.  
  3. Read bytes: "\nwhat do y"

3)

  1. const (
  2. PathSeparator = '/' // 操作系统指定的路径分隔符
  3. PathListSeparator = ':' // 操作系统指定的表分隔符
  4. )

举例:

  1. const DevNull = "/dev/null"

DevNull是操作系统空设备的名字。在类似Unix的操作系统中,是"/dev/null";在Windows中,为"NUL"。

  1. package main
  2. import(
  3. "fmt"
  4. "os"
  5. )
  6. func main() {
  7. fmt.Println(os.PathSeparator) //
  8. fmt.Printf("%q\n", os.PathSeparator) //'/'
  9. fmt.Println(os.PathListSeparator) //
  10. fmt.Printf("%q\n", os.PathListSeparator) //':'
  11. }

2.var变量

1)

  1. var (
  2. ErrInvalid = errors.New("invalid argument")
  3. ErrPermission = errors.New("permission denied")
  4. ErrExist = errors.New("file already exists")
  5. ErrNotExist = errors.New("file does not exist")
  6. )

一些可移植的、共有的系统调用错误。

  1. package main
  2. import(
  3. "fmt"
  4. "os"
  5. )
  6. func main() {
  7. fmt.Println(os.ErrInvalid) //invalid argument
  8. fmt.Println(os.ErrPermission) //permission denied
  9. fmt.Println(os.ErrExist) //file already exists
  10. fmt.Println(os.ErrNotExist) //file does not exist
  11. }

2)

  1. var (
  2. Stdin = NewFile(uintptr(syscall.Stdin), "/dev/stdin")
  3. Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout")
  4. Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr")
  5. )

syscall的额外知识:

  1. var (
  2. Stdin =
  3. Stdout =
  4. Stderr =
  5. )

Stdin、Stdout和Stderr是指向标准输入、标准输出、标准错误输出的文件描述符。

  1. package main
  2. import(
  3. "fmt"
  4. "os"
  5. )
  6. func main() {
  7. fmt.Println(os.Stdin) //&{0xc42008c000}
  8. fmt.Println(os.Stdout) //&{0xc42008c050}
  9. fmt.Println(os.Stderr) //&{0xc42008c0a0}
  10. }

其中os.Stdout 和 os.Stderr实现了io.Writer,所以其可以使用Write();os.Stdin 实现了io.Reader,所以可以使用Read()

1》uintptr

uintptr是一种无符号的整数类型,没有指定具体的bit大小但是足以容纳指针,是能存储指针的整形。

uintptr类型只有在底层编程时才需要,特别是Go语言和C语言函数库或操作系统接口相交互的地方

2》func NewFile

  1. func NewFile(fd uintptr, name string) *File

NewFile使用给出的Unix文件描述符和名称创建一个文件

这个函数并不是真正创建了一个文件,是新建一个文件,但是不保存,然后返回文件的指针

参数fd其实可以通过os.Fd()函数得到

3》func (*File) Fd

  1. func (f *File) Fd() uintptr

Fd返回与文件f对应的整数类型的Unix文件描述符

Fd()举例:

  1. package main
  2. import(
  3. "fmt"
  4. "os"
  5. "log"
  6. "syscall"
  7. )
  8. func main() {
  9. file, err := os.Open("test.txt")
  10. if err != nil {
  11. log.Fatal(err)
  12. }
  13. defer file.Close()
  14. fmt.Printf("%q\n", file.Fd()) //'\x03'
  15. fmt.Printf("%q\n", uintptr(syscall.Stdin)) //'\x00'
  16. fmt.Printf("%q\n", uintptr(syscall.Stdout)) //'\x01'
  17. fmt.Printf("%q\n", uintptr(syscall.Stderr)) //'\x02'
  18. }

Fd()和NewFile():

  1. package main
  2. import(
  3. "fmt"
  4. "os"
  5. "syscall"
  6. "log"
  7. )
  8. func main() {
  9. file := os.NewFile(uintptr(syscall.Stdin), "testNewFile.txt")
  10. fmt.Printf("%q\n", file.Fd())
  11. fmt.Printf("%q\n", file.Name())
  12. fileInfo, err := file.Stat()
  13. if err != nil{
  14. log.Fatal(err)
  15. }
  16. fmt.Printf("%q\n", fileInfo)
  17. }

返回:

  1. userdeMBP:go-learning user$ go run test.go
  2. '\x00'
  3. "testNewFile.txt"
  4. &{"testNewFile.txt" '\x00' %!q(os.FileMode=) {%!q(uint64=) %!q(int64=) %!q(*time.Location=&{ [] [] <nil>})} {%!q(int32=) '←' '\x01' 'ʍ' 'ǵ' '\x04' %!q(int32=) "\x00\x00\x00\x00" {%!q(int64=) %!q(int64=)} {%!q(int64=) %!q(int64=)} {%!q(int64=) %!q(int64=)} {'\x00' '\x00'} '\x00' '\x00' '
  5. go标准库的学习-os的更多相关文章

      1. go标准库的学习-net/http
      1. 参考:https://studygolang.com/pkgdoc 概念解释: request:用户请求的信息,用来解析用户的请求信息,包括post.get.cookie.url等信息 respons ...

      1. go标准库的学习-database/sql
      1. 参考:https://studygolang.com/pkgdoc 导入方式: import "database/sql" sql包提供了保证SQL或类SQL数据库的泛用接口. 使 ...

      1. go标准库的学习-crypto/md5
      1. 参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/md5" md5包实现了MD5哈希算法,参见RFC 1321. Con ...

      1. go标准库的学习-crypto/sha1
      1. 参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/sha1" sha1包实现了SHA1哈希算法,参见RFC 3174. ...

      1. go标准库的学习-crypto/sha256
      1. 参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/sha256" sha256包实现了SHA224和SHA256哈希算法 ...

      1. python 标准库基础学习之开发工具部分1学习
      1. #2个标准库模块放一起学习,这样减少占用地方和空间#标准库之compileall字节编译源文件import compileall,re,sys#作用是查找到python文件,并把它们编译成字节码表示, ...

      1. python linecache标准库基础学习
      1. #python标准库基础之:linecacge:高效读取文本文件#说明与作用"""可以从文件或者导入python模块获取文件,维护一个结果缓存,从而可以更高效地从相同文件 ...

      1. python calendar标准库基础学习
      1. # -*- coding: utf-8 -*-# 作者:新手__author__ = 'Administrator'#标准库:日期时间基础学习:calendar:处理日期#例1import calen ...

      1. go标准库的学习-path/filepath
      1. 参考https://studygolang.com/pkgdoc 标准库path中有的该path/filepath库中都有,所以一般都使用path/filepath 导入方式: import &quo ...

    1.  
    2. 随机推荐

        1. Angular6 项目开发常用时间组件服务
        1. 一.利用Angular 命令行工具生成一个服务. 详情见:<Angular环境搭建>,服务代码如下: import { Injectable } from '@angular/core'; ...

        1. thinkphp 使用paginate分页搜索带参数
        1. 最近做项目发现使用paginate分页,搜索的时候点下一页搜索条件就变没了,所以在网上找了找一些方法,有的说是使用Page类,但是用习惯了paginate,再用Page不习惯,找到了一个方法,可以使用 ...

        1. 一句SQL完成动态分级查询
        1. 在最近的活字格项目中使用ActiveReports报表设计器设计一个报表模板时,遇到一个多级分类的难题:需要将某个部门所有销售及下属部门的销售金额汇总,因为下属级别的层次不确定,所以靠拼接子查询的方式 ...

        1. zxing开源库的基本使用
        1. 如果你的项目中有模块跟二维码相关的话,那你一定听过或者用过大名鼎鼎的zxing开源库. 什么是zxing? ZXing是一个开源的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其 ...

        1. Testlink1.9.17使用方法(第七章 测试用例集管理)
        1. 第七章 测试用例集管理 QQ交流群:585499566 测试用例准备好以后,可以对测试用例集进行相关的操作. 一. 添加测试用例到测试计划中 在主页的“当前测试计划”下拉列表里-->选择一个测试 ...

        1. 使用adb命令通过IP地址连接手机
        1. 前提:已经通过USB设备线连接过电脑,并成功安装驱动. adb连接手机进行调试有两种方式,一种是使用USB线,另一种是使用无线WiFi. 第一种  使用USB线连接 1. 在手机上启用USB调试 2. ...

        1. [Java]Socket和ServerSocket学习笔记
        1. 对于即时类应用或者即时类的游戏,HTTP协议很多时候无法满足于我们的需求.这会,Socket对于我们来说就非常实用了.下面是本次学习的笔记.主要分异常类型.交互原理.Socket.ServerSock ...

        1. c++屏蔽Win10系统快捷键
        1. 很久之前实现的功能,也是参考其他人的实现,时间太久,具体参考哪里已经记不得了. 这里不仅能屏蔽一般的快捷键,还可以屏蔽ctrl+atl+del. ; HHOOK keyHook = NULL; HHO ...

        1. Docker Compose 安装 on centos7
        1. 本文演示如何在CentOS7上安装Docker Compose. 1 在线安装 1.1 下载安装包 $ curl -L https://github.com/docker/compose/releas ...

        1. Cas 服务器 JDBC身份校验
        1. 之前的Cas服务器一直使用静态配置的账号密码进行身份认证,现在要让Cas服务器通过MySQL数据库中的用户信息进行身份认证. 一.添加数据库访问依赖 <!-- https://mvnreposi ...