os.FileInfo

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)
    }
}

你可能感兴趣的:(os.FileInfo)