os.FileInfo
接口用来描述一个文件对象,实际是fs
包中fs.FileInfo
的别名。
type FileInfo = fs.FileInfo
fs
包的fs.FileInfo
接口
// A FileInfo describes a file and is returned by Stat.
type FileInfo interface {
Name() string // base name of the file
Size() int64 // length in bytes for regular files; system-dependent for others
Mode() FileMode // file mode bits
ModTime() time.Time // modification time
IsDir() bool // abbreviation for Mode().IsDir()
Sys() interface{} // underlying data source (can return nil)
}
接口 | 描述 |
---|---|
Name() string | 获取文件名称 |
Size() int64 | 文件字节大小 |
Mode() FileMode | 文件的模式位 |
ModTime() time.Time | 文件修改时间 |
IsDir() bool | 是否为文件夹,等同于Mode().IsDir() |
Sys() interface{} | 地城数来源 |
例如:获取当前脚本信息
//获取当前文件
_,file,_,_ := runtime.Caller(0)
fmt.Println(file)
//获取文件信息
fi,err := os.Stat(file)
if err!=nil {
log.Fatalln(err)
}
fmt.Printf("filename: %s\n", fi.Name())
fmt.Printf("filesize: %d\n", fi.Size())
fmt.Printf("filemode: %v\n", fi.Mode())
fmt.Printf("modtime: %v\n", fi.ModTime())
fmt.Printf("isdir: %v\n", fi.IsDir())
fmt.Printf("sys: %v\n", fi.Sys())
F:/Go/project/test/main.go
filename: main.go
filesize: 455
filemode: -rw-rw-rw-
modtime: 2021-12-26 12:57:25.0439303 +0800 CST
isdir: false
sys: &{32 {557161308 30931096} {322441693 30931477} {318463111 30931477} 0 455}
os.Stat
os.Stat
函数用于获取文件属性,返回描述文件信息的fs.FileInfo
类型值,通过它可以获取对应接口信息。错误底层类型为*PathError
。
func Stat(name string) (FileInfo, error)
若指定的文件对象是一个符号链接,则返回的FileInfo
会描述改符号链接指向文件的信息。
创建目录
创建目录 | 描述 |
---|---|
os.Mkdir | 创建单级目录 |
os.MkdirAll | 循环创建多级目录 |
os.Mkdir
os.Mkdir()
用于创建单级目录,该目录具有FileMode
权限,当创建一个已存在的目录时会报错。
func Mkdir(name string, perm FileMode) error
fs
包中的FileMode
对应的是一个uint32
类型
package os
type FileMode = fs.FileMode
package fs
type FileMode uint32
package os
ModePerm = fs.ModePerm // Unix permission bits, 0o777
package fs
ModePerm FileMode = 0777 // Unix permission bits
例如:在当前目录下创建名为tmp
的临时目录,并设置权限位0777。
var pathSeparator string
if os.IsPathSeparator('\\') {
pathSeparator = "\\"
}else {
pathSeparator = "/"
}
pwd,err := os.Getwd()
if err!=nil{
log.Fatalln(err)
return
}
pwdPath := pwd + pathSeparator
dirPath := pwdPath + "tmp"
err = os.Mkdir(dirPath, os.ModePerm)
if err!=nil {
log.Fatalln(err)
return
}
若待创建的目录已经存在则会出现错误
2021/12/26 16:30:04 mkdir F:\Go\project\test\tmp: Cannot create a file when that file already exists.
因此创建前必须判断目录是否存在,若存在则修改权限,否则创建。
_,err = os.Stat(dirPath)
if err!=nil {
if os.IsNotExist(err) {
if err:=os.Mkdir(dirPath, os.ModePerm); err!=nil{
log.Println(err)
}
}
}else{
if err = os.Chmod(dirPath, os.ModePerm); err!=nil{
log.Println(err)
}
}
os.MkdirAll
os.MkdirAll()
用于循环创建多级目录,作用类似命令mkdir -p
。
例如:创建多级目录
var ps string
if os.IsPathSeparator('\\') {
ps = "\\"
}else {
ps = "/"
}
pwd,err := os.Getwd()
if err!=nil{
log.Fatalln(err)
return
}
dirPath := pwd + ps + "tmp" + ps + time.Now().Format("20060102") + ps
_,err = os.Stat(dirPath)
if err!=nil {
if os.IsNotExist(err) {
if err:=os.MkdirAll(dirPath, os.ModePerm); err!=nil{
log.Println(err)
}
}
}else{
if err = os.Chmod(dirPath, os.ModePerm); err!=nil{
log.Println(err)
}
}