搜索
您的当前位置:首页正文

Go语言文件处理(上)

来源:知库网

我们前面也曾经讲过一些关于文件系统的内容,那么接下来几篇文章我们在详细讲解一下关于文件系统的一些内容。
我们所使用的大多数文件操作函数都是在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底层类型的错误。

Top