• go创建指定大小的文件,获取文件大小


    package main
    
    import (
        "log"
        "os"
    )
    
    var size = int64(1024 )
    
    func main() {
        f, err := os.Create("foobar1.bin")
        if err != nil {
            log.Fatal(err)
        }
        defer f.Close()
    
        if err := f.Truncate(size); err != nil {
            log.Fatal(err)
        }
        // Output:
        //
        finfo, _ := os.Stat("./foobar1.bin")
        log.Println(finfo.Size())
    
        fi, _ := f.Stat()
        log.Println("f Stat:", fi.Size())
    }
                                                                 
                                                                 
    

      ---------------

    在项目中,我们可能会需要获取一个文件的大小,在Go语言中,有很多方法来获取一个文件的大小

    Read字节方式

    func main() {
        file,err:=os.Open("water")
        if err ==nil {
            sum := 0
            buf:=make([]byte,2014)
            for  {
                n,err:=file.Read(buf)
                sum+=n
                if err==io.EOF {
                    break
                }
            }
            fmt.Println("file size is ",sum)
        }
    }
    
    

    这种方式需要打开文件,通过for循环读取文件的字节内容,然后算出文件的大小,这样时也是最不能用的办法,因为效率低,代码量大。

    ioutil方式

    上面的代码比较啰嗦,这时候我们可能想到了使用ioutil包的ReadFile来代替,直接获得文件的内容,进而计算出文件的大小。

    func main() {
        content,err:=ioutil.ReadFile("water")
        if err == nil {
            fmt.Println("file size is ",len(content))
        }
    }
    

    通过ioutil.ReadFile函数,我们三行代码就可以搞定,的确方便很多,但是效率慢的问题依然,存在,如果是个很大的文件呢?

    Stat方法

    继续再进一步,我们不读取文件的内容来计算了,我们通过文件的信息

    func main() {
        file,err:=os.Open("water")
    
        if err == nil {
            fi,_:=file.Stat()
            fmt.Println("file size is ",fi.Size())
        }
    }
    

    这种方式不会再读取文件的内容,而是通过Stat方法直接获取,速度会非常快,尤其对于大文件尤其有用。但是它还不是我们今天要讲的终极办法,因为它还是会打开文件,会占用它

    终极方案 os.Stat()

    func main() {
        fi,err:=os.Stat("water")
        if err ==nil {
            fmt.Println("file size is ",fi.Size(),err)
        }
    }
    

    是的,也只需要三行代码即可实现,这里使用的是os.Stat,通过他可以获得文件的元数据信息,现在我们看看它能获取到哪些信息。

    获取文件信息

    通过os.Stat方法,我们可以获取文件的信息,比如文件大小、名字等。

    func main() {
        fi,err:=os.Stat("water")
        if err ==nil {
            fmt.Println("name:",fi.Name())
            fmt.Println("size:",fi.Size())
            fmt.Println("is dir:",fi.IsDir())
            fmt.Println("mode::",fi.Mode())
            fmt.Println("modTime:",fi.ModTime())
        }
    }
    

    运行这段代码看下结果:

    name: water
    size: 403
    is dir: false
    mode:: -rw-r--r--
    modTime: 2018-05-06 18:52:07 +0800 CST
    

    以上就是可以获取到的文件信息,还包括判断是否是目录,权限模式和修改时间。所以我们对于文件的信息获取要使用os.Stat函数,它可以在不打开文件的情况下,高效获取文件信息。

  • 相关阅读:
    windows下Yarn安装与使用(两种方法)
    git配置公钥---解决码云出现git@gitee.com: Permission denied (publickey)
    npm使用国内镜像的两种方法
    【LeetCode】33. Search in Rotated Sorted Array (4 solutions)
    【LeetCode】83. Remove Duplicates from Sorted List
    【LeetCode】82. Remove Duplicates from Sorted List II
    【LeetCode】85. Maximal Rectangle
    【LeetCode】84. Largest Rectangle in Histogram
    【LeetCode】87. Scramble String
    【LeetCode】162. Find Peak Element (3 solutions)
  • 原文地址:https://www.cnblogs.com/oxspirt/p/14703931.html
Copyright © 2020-2023  润新知