go语言学习笔记文件操作

suoning suoning     2022-09-10     682

关键词:

加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959

文件读取

os.File 封装了文件相关操作

技术分享
type File
File代表一个打开的文件对象。

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

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

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

func NewFile(fd uintptr, name string) *File
NewFile使用给出的Unix文件描述符和名称创建一个文件。

func Pipe() (r *File, w *File, err error)
Pipe返回一对关联的文件对象。从r的读取将返回写入w的数据。本函数会返回两个文件对象和可能的错误。

func (f *File) Name() string
Name方法返回(提供给Open/Create等方法的)文件名称。

func (f *File) Stat() (fi FileInfo, err error)
Stat返回描述文件f的FileInfo类型值。如果出错,错误底层类型是*PathError。

func (f *File) Fd() uintptr
Fd返回与文件f对应的整数类型的Unix文件描述符。

func (f *File) Chdir() error
Chdir将当前工作目录修改为f,f必须是一个目录。如果出错,错误底层类型是*PathError。

func (f *File) Chmod(mode FileMode) error
Chmod修改文件的模式。如果出错,错误底层类型是*PathError。

func (f *File) Chown(uid, gid int) error
Chown修改文件的用户ID和组ID。如果出错,错误底层类型是*PathError。

func (f *File) Readdir(n int) (fi []FileInfo, err error)
Readdir读取目录f的内容,返回一个有n个成员的[]FileInfo,这些FileInfo是被Lstat返回的,采用目录顺序。对本函数的下一次调用会返回上一次调用剩余未读取的内容的信息。
如果n>0,Readdir函数会返回一个最多n个成员的切片。这时,如果Readdir返回一个空切片,它会返回一个非nil的错误说明原因。如果到达了目录f的结尾,返回值err会是io.EOF。
如果n<=0,Readdir函数返回目录中剩余所有文件对象的FileInfo构成的切片。此时,如果Readdir调用成功(读取所有内容直到结尾),它会返回该切片和nil的错误值。如果在到达结尾前遇到错误,会返回之前成功读取的FileInfo构成的切片和该错误。

func (f *File) Readdirnames(n int) (names []string, err error)
Readdir读取目录f的内容,返回一个有n个成员的[]string,切片成员为目录中文件对象的名字,采用目录顺序。对本函数的下一次调用会返回上一次调用剩余未读取的内容的信息。
如果n>0,Readdir函数会返回一个最多n个成员的切片。这时,如果Readdir返回一个空切片,它会返回一个非nil的错误说明原因。如果到达了目录f的结尾,返回值err会是io.EOF。
如果n<=0,Readdir函数返回目录中剩余所有文件对象的名字构成的切片。此时,如果Readdir调用成功(读取所有内容直到结尾),它会返回该切片和nil的错误值。如果在到达结尾前遇到错误,会返回之前成功读取的名字构成的切片和该错误。

func (f *File) Truncate(size int64) error
Truncate改变文件的大小,它不会改变I/O的当前位置。 如果截断文件,多出的部分就会被丢弃。如果出错,错误底层类型是*PathError。

func (f *File) Read(b []byte) (n int, err error)
Read方法从f中读取最多len(b)字节数据并写入b。它返回读取的字节数和可能遇到的任何错误。文件终止标志是读取0个字节且返回值err为io.EOF。

func (f *File) ReadAt(b []byte, off int64) (n int, err error)
ReadAt从指定的位置(相对于文件开始位置)读取len(b)字节数据并写入b。它返回读取的字节数和可能遇到的任何错误。当n<len(b)时,本方法总是会返回错误;如果是因为到达文件结尾,返回值err会是io.EOF。

func (f *File) Write(b []byte) (n int, err error)
Write向文件中写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法会返回一个非nil的错误。

func (f *File) WriteString(s string) (ret int, err error)
WriteString类似Write,但接受一个字符串参数。

func (f *File) WriteAt(b []byte, off int64) (n int, err error)
WriteAt在指定的位置(相对于文件开始位置)写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法会返回一个非nil的错误。

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

func (f *File) Sync() (err error)
Sync递交文件的当前内容进行稳定的存储。一般来说,这表示将文件系统的最近写入的数据在内存中的拷贝刷新到硬盘中稳定保存。

func (f *File) Close() error
Close关闭文件f,使文件不能用于读写。它返回可能出现的错误。
os.File Pkg Doc

 

读写参数

文件打开模式:

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

权限控制:

r ——> 004
w ——> 002
x ——> 001

 

读取栗子

os.Open || os.OpenFile
package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    // file, err := os.Open("/tmp/test")
    file, err := os.OpenFile("/tmp/test", os.O_CREATE|os.O_WRONLY, 0666)
    if err != nil {
        fmt.Println("Open file error: ", err)
        return
    }
    defer file.Close()    //关闭文件

    reader := bufio.NewReader(file)    //带缓冲区的读写
    for {
        str, err := reader.ReadString(
)    // 循环读取一行
        if err != nil {
            fmt.Println("read string failed, err: ", err)
            return
        }
        fmt.Println("read string is %s: ", str)
    }
}

 

读取整个文件栗子

"io/ioutil" 包实现了读取整个文件功能

package main

import (
    "fmt"
    "os"
    "io/ioutil"
)

func main() {
    fileName := "/tmp/test"

    file, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR, 0666)
    if err != nil {
        fmt.Println("Open file error: ", err)
        return
    }
    defer file.Close()

    buf, err := ioutil.ReadAll(file)
    //buf, err := ioutil.ReadFile(fileName)
    if err != nil {
        fmt.Fprintf(os.Stderr, "File Error: %s
", err)
        return
    }
    fmt.Printf("%s
", string(buf))
}

 

读取压缩文件栗子

"compress/*" 包实现压缩文件功能。

"compress/gzip" 包实现了gzip格式压缩文件的读写 

package main

import (
    "bufio"
    "compress/gzip"
    "fmt"
    "os"
)

func main() {
    fileName := "/tmp/test.log.gz"

    var r *bufio.Reader

    fi, err := os.Open(fileName)
    if err != nil {
        fmt.Println("error", err)
        os.Exit(1)
    }

    fz, err := gzip.NewReader(fi)
    if err != nil {
        fmt.Println("error", err)
        return
    }

    r = bufio.NewReader(fz)
    for {
        line, err := r.ReadString(
)
        if err != nil {
            fmt.Println("Done reading file")
            return
        }
        fmt.Println(line)
    }
}

 

文件写入

file.WriteString || file.Write

package main

import (
    "fmt"
    "os"
)

func main() {
    fileName := "/tmp/test_write"

    file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, 0755)
    if err != nil {
        fmt.Println("error", err)
        os.Exit(1)
    }
    defer file.Close()

    fileString := "Today very happy."
    file.Seek(0, 2)    // 最后增加
    file.WriteString(fileString)
    //file.Write([]byte(fileString))
}

 

bufio.Writer.WriteString

带缓冲的写,最后要将缓冲中的数据写入下层的io.Writer接口(Flush方法)

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    fileName := "/tmp/test_write"

    file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, 0755)
    if err != nil {
        fmt.Println("error", err)
        os.Exit(1)
    }
    defer file.Close()

    fileWrite := bufio.NewWriter(file)
    fileString := "good.
"
    for i := 0; i < 10; i++ {
        fileWrite.WriteString(fileString)
    }
    fileWrite.Flush()
}

 

拷贝文件栗子

从一个文件拷贝到另一个文件

package main

import (
    "fmt"
    "io"
    "os"
)

func CopyFile(dstName, srcName string) (writeen int64, err error) {
    src, err := os.Open(dstName)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer src.Close()

    dst, err := os.OpenFile(srcName, os.O_CREATE|os.O_WRONLY, 0644)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer dst.Close()

    return io.Copy(dst, src)
}

func main() {
    CopyFile("/tmp/test", "/tmp/test_copy1")
    fmt.Println("copy done.")
}

 

go语言命令行复习笔记(代码片段)

Go语言自带有一套完整的命令操作工具。goclean这个命令是用来移除当前源码包里面编译生成的文件。我一般都是利用这个命令清除编译文件,然后github递交源码,在本机测试的时候这些编译文件都是和系统相关的,但... 查看详情

go笔记-标准库的介绍

【unsafe】包含了一些打破Go语言“类型安全”的命令,一般的程序中不会被使用,可用在C/C++程序的调用中【syscall】底层的外部包,提供了操作系统底层调用的基本接口【os/exec】提供我们运行外部操作系统命令和程序的方... 查看详情

go语言学习笔记

一、初入GO语言我们先还是看看GO语言的helloworld是怎么写的吧packagemainimport"fmt"funcmain()fmt.Println("Helloworld!")第一行:包声明,编写源文件时,必须在非注释的第一行指明这个文件属于哪个包,如​​packagemain​​第二行:引入包,... 查看详情

文件上传和文件下载--go语言学习笔记(代码片段)

文件上传和文件下载–Go语言学习笔记###文件上传文件上传:客户端把上传文件转换为二进制流后发送给服务器,服务器对二进制进行解析HTML表单属性控制表单在提交数据到服务器时数据的编码类型enctype="application/x-www-f... 查看详情

go语言学习笔记—基础—基本数据类型—字符串(10):实战——从.ini配置文件中,查询需要的值(代码片段)

.ini文件是一种古老的配置文件格式。在一些操作系统、虚幻游戏引擎、git版本管理中都在使用.ini文件格式。下面展示了.ini文件的样式。[core]repositoryformatversion=0filemode=falsebare=falselogallrefupdates=truesymlinks=falseignorecase... 查看详情

go学习golang底层学习笔记(代码片段)

1.1.1.Go编译词法与语法分析意义:解析源代码文件,将文件中字符串序列转换成Token序列把执行词法分析的程序称为词法解析器(lexer)语法解析的结果就是抽象语法树(AST)每个AST都对应一个单独的Go语言文件,这个抽象语法树中包括当前... 查看详情

go语言笔记——切片函数常见操作,增删改查和搜索排序

7.6.6搜索及排序切片和数组标准库提供了 sort 包来实现常见的搜索和排序操作。您可以使用 sort 包中的函数 funcInts(a[]int) 来实现对int类型的切片排序。例如 sort.Ints(arri),其中变量arri就是需要被升序排序... 查看详情

go语言学习笔记—基础—go工具:编译后运行——gorun(代码片段)

python语言可以在不输出二进制可执行文件情况下,使用虚拟机直接执行源文件。go语言没有虚拟机,但使用gorun可以达到同样效果。gorun会编译go源码,直接执行go源码中的main()函数,不在当前目录下输出任何可执行... 查看详情

go语言文件操作(代码片段)

文件的打开和关闭和C语言一样,Go语言中操作文件也是通过一个FILE结构体typefilestruct pfdpoll.FD namestring dirinfo*dirInfotypeFilestruct *file//osspecificOpen函数funcOpen(namestring)(file*File,errerror)Open打开一个文件用于读取Close函数func(f*F 查看详情

go语言学习——文件操作(读取和写入)

文件操作打开和关闭文件os.Open()函数打开一个文件返回一个*File和一个err对得到的文件实例调用close()方法关闭文件读取文件file.Read()bufio读取文件ioutil读取整个文件packagemainimport("bufio""fmt""io 查看详情

go入门笔记

...歌GO开发团队核心成员联合编写,Go语言编程圣经。本笔记是学习翻阅此书中文翻译版,整理而成。非常感谢李道兵、高博等辛苦的翻译。GoIDE-Golang使用入门参考如下。https://www.2cto.com/kf/201704/632395.htmlGo语言简介【1】Go语... 查看详情

学习笔记golang语法学习笔记(代码片段)

一、入门go是编译型的语言,代码风格类似于C语言,其最大特点是支持并发编程,go文件后缀名为.go在命令行通过gorunhelloworld.go来运行,或先通过gobuildhelloworld.go编译,然后./helloworld执行,在windows下编译生... 查看详情

go学习笔记02-源码

第二部分源码基于Go1.4,相关文件位于src/runtime目录。文章忽略了32bit代码,有兴趣的可自行查看源码文件。为便于阅读,示例代码做过裁剪。1.MemoryAllocatorGo内存分配器基于tcmalloc模型,这在malloc.h头部注释中有明确说明。Memoryallo... 查看详情

go语言笔记——切片函数常见操作,增删改查和搜索排序(代码片段)

7.6.6搜索及排序切片和数组标准库提供了 sort 包来实现常见的搜索和排序操作。您可以使用 sort 包中的函数 funcInts(a[]int) 来实现对int类型的切片排序。例如 sort.Ints(arri),其中变量arri就是需要被升序排序... 查看详情

go语言学习笔记—基础—go工具:编译——gobuild(代码片段)

go语言的编译不像C++一样配置各种包含路径、链接库地址。1.gobuild(无参数编译)如果源码中没有GOPATH的包依赖,则可以使用无参数编译go源码。gobuild会搜索当前目录下的go源文件,编译,然后在当前目录下,... 查看详情

go语言学习之旅--文件os(代码片段)

Go语言学习之旅--文件os库OS文件、目录操作File文件读操作File文件写操作os包进程相关操作os包和环境相关的方法博客根据B站《golang入门到项目实战[2021最新Go语言教程,没有废话,纯干货》视频整理的,如有错误请大... 查看详情

go语言学习之旅--文件os(代码片段)

Go语言学习之旅--文件os库OS文件、目录操作File文件读操作File文件写操作os包进程相关操作os包和环境相关的方法博客根据B站《golang入门到项目实战[2021最新Go语言教程,没有废话,纯干货》视频整理的,如有错误请大... 查看详情

go语言学习笔记—基础—go工具:编译并安装——goinstall(代码片段)

goinstall包名,包名是相对于$GOPATH/src目录的包路径。假设本地包的绝对路径是$GOPATH/src/github.com/locutus666/go_learing/ch16/goinstall,则有如下安装操作://GOPATH=~/go#goinstallgithub.com/locutus666/go_learing/ch1 查看详情