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