os.FileInfo

作者: JunChow520 | 来源:发表于2021-12-26 17:58 被阅读0次

    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

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