美文网首页Go语言实践Go
Go语言文件处理(上)

Go语言文件处理(上)

作者: 帅气的昵称都有人用了 | 来源:发表于2019-05-06 11:28 被阅读2次

我们前面也曾经讲过一些关于文件系统的内容,那么接下来几篇文章我们在详细讲解一下关于文件系统的一些内容。
我们所使用的大多数文件操作函数都是在os包里面,我们来看几个最为常用的几个函数:

// 文件名称为name,权限设置为perm
func Mkdir(name string, perm FileMode) error
// 根据path创建多级子路径
func MkdirAll(path string, perm FileMode) error
// 删除名为name的目录
func Remove(name string) error
// 根据path删除多级目录
func RemoveAll(path string) error

创建文件与查看状态

创建文件

创建的方法主要有两种:

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

该函数返回了一个文件对象,默认权限为0666,返回的文件对象是可读写的。

func NewFile(fd uintptr, name string) *File

根据文件描述符创建相应的文件。


创建文件夹

在最前面我们已经说过了这个函数了,在这里就不再赘述:

func MkdirAll(path string, perm FileMode) error

文件/文件夹状态

查看状态的函数如下:

func Stat(name string) (FileInfo, error)
举个例子

在这里我们来举一个例子:

package main

import (
    "fmt"
    "os"
)

var (
    newFile *os.File
    fileInfo os.FileInfo
    err error
    path = "test/test2/"
    fileName = "demo"
    filePath = path + fileName
)

func main() {
    err := os.MkdirAll(filePath, 0777)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println("Success!")
    }

    newFile, err := os.Create(fileName)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println("Success!")
    }
    fmt.Println(newFile)
    newFile.Close()

    fileInfo, err := os.Stat(filePath)
    if err != nil && os.IsNotExist(err) {
        fmt.Println("File not exist!")
    } else {
        fmt.Println(err)
    }
    fmt.Println("File Name: ", fileInfo.Name())
    fmt.Println("File Size: ", fileInfo.Size())
    fmt.Println("File Mode: ", fileInfo.Mode())
    fmt.Println("File ModeTime: ", fileInfo.ModTime())
    fmt.Println("File is a dir or not: ", fileInfo.IsDir())
    fmt.Printf("The type of interface: %T\n", fileInfo.Sys())
    fmt.Printf("The info of system: %+v\n\n", fileInfo.Sys())
}
/**The result is:
Success!
Success!
&{0xc000082780}
<nil>
File Name:  demo
File Size:  0
File Mode:  drwxrwxrwx
File ModeTime:  2019-05-06 10:43:22.2414672 +0800 CST
File is a dir or not:  true
The type of interface: *syscall.Win32FileAttributeData
The info of system: &{FileAttributes:16 CreationTime:{LowDateTime:2021153104 HighDateTime:30737333} LastAccessTime:{LowDateTime:2021153104 HighDateTime:30737333} LastWriteTime:{LowDateTime:2021153104 HighDateTime:30737333} FileSizeHigh:0 FileSizeLow:0}
 */

我们注意到在程序里面有一个专门用来判断文件是否存在的函数,os.IsNotExist(err)这个函数传入的是err这样的一个参数,然后判断文件是否存在并且返回一个布尔值。


重命名与移动

在Go语言中,重命名和移动文件/文件夹都是相同的原理,使用的函数为:

func Rename(oldpath, newpath string) error

我们还是通过例子来看一下:

package main

import (
    "log"
    "os"
)

func main() {
    originalPath := "test.txt"
    newPath := "test2.txt"
    err := os.Rename(originalPath, newPath)
    if err != nil {
        log.Fatal(err)
    }
}

路径的更改也是同一个原理。


打开与关闭

我们在打开文件的时候,有两种方法可以进行参考:

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

这个函数打开的是名为name的文件,然后使用的方式是只读的方式,其内部实现还调用了一个函数:

func OpenFile(name string, flag int, perm uint32) (file *File, err Error)

这就是我们要说的第二个函数,在这里面,我们多添加了两个参数,其中flag是打开的方式,perm是权限。
其中flag参数中的数值既可以单独使用,也可以复合使用,复合使用时在两者之间添加OR操作符即可:

// flag参数
os.O_CREATE|os.O_APPEND
os.O_CREATE|os.O_TRUNC|os.O_WRONLY
// os.O_RDONLY // 只读
// os.O_WRONLY // 只写
// os.O_RDWR // 读写
// os.O_APPEND // 往文件中添加
// os.O_CREATE // 如果文件不存在则先创建
// os.O_TRUNC // 文件打开时裁剪文件
// os.O_EXCL // 和O_CREATE一起使用,文件不能存在
// os.O_SYNC // 以同步I/O的方式打开

删除与截断

前面是创建,后面就肯定是删除喽:

package main

import (
"log"
"os"
)

func main() {
    err := os.Remove("text.txt")
    if err != nil {
        log.Fatal(err)
    }
}

这个就很普通了,但Go语言还提供了一个很有意思的方法,那就是截断函数

package main

import (
    "log"
    "os"
)

func main() {
    err := os.Truncate("text.txt", 100)
    if err != nil {
        log.Fatal(err)
    }
}

我们看一下这个截断函数:

func Truncate(name string, size int64) error

Truncate修改name指定的文件的大小。如果该文件为一个符号链接,将修改链接指向的文件的大小。如果出错,会返回*PathError底层类型的错误。

相关文章

  • Go语言文件处理(上)

    我们前面也曾经讲过一些关于文件系统的内容,那么接下来几篇文章我们在详细讲解一下关于文件系统的一些内容。我们所使用的...

  • go语言能做什么

    鉴于Go语言的特点和设计的初衷,Go语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式...

  • Go语言文件处理(下)

    读写文件 我们在读写文件中最为常见的操作有:复制文件,编辑,跳转,替换等。 复制文件 先来看复制文件是如何操作的:...

  • GO语言初级学习之代码案例07 (文件操作)

    @(go语言 黑马)[GO语言] 文件处理-行读取 题目:把一个文本文件一行一行读取出来 逻辑:见代码; 代码如下...

  • 002-helloword

    go语言文件以 .go结束符结尾 go语言运行

  • go fmt与gofmt命令

    go fmt命令会按照Go语言代码规范格式化指定代码包中的所有Go语言源码文件的代码,所有Go语言源码文件即包括命...

  • 初识Go语言

    Go 语言结构 初识Go语言 Go 语言结构 代码说明: ① 定义包名,必须在源文件中非注释的第一行指明这个文件...

  • Go语言:文件追加内容

    代码实例 相关文章 Go语言:获取某个目录下的所有文件 Go语言:读取文本文件并输出内容 Go语言:将字符串保存成...

  • Go语言:将字符串保存成文件

    代码实例 相关文章 Go语言:获取某个目录下的所有文件 Go语言:读取文本文件并输出内容 Go语言:将字符串保存成...

  • 兄弟连Go语言培训分享Go协程测试

    Go语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等;网络编程方面...

网友评论

    本文标题:Go语言文件处理(上)

    本文链接:https://www.haomeiwen.com/subject/kkaloqtx.html