zoukankan      html  css  js  c++  java
  • 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函数,它可以在不打开文件的情况下,高效获取文件信息。

  • 相关阅读:
    删除数据库的数据后让id从1开始算
    通过数据库绑定的dropdownlist,如何让其第一条默认显示"--请选择--"
    winform 验证用户正确后打开新窗口时关闭登陆窗口
    winform FormBordStyle=none 及 wpf FormBordStyle=none 的鼠标点击移动问题
    [AngularJS] AngularJS系列(3) 中级篇之表单验证
    linux开启mysql远程登录
    linux下JDK,tomcat的安装与环境变量配置
    linux下mysql连接jar包的位置在哪里?
    linux下mysql忘记root密码的解决方案
    RedHat下MySQL 5.6 安装、维护
  • 原文地址:https://www.cnblogs.com/oxspirt/p/14703931.html
Copyright © 2011-2022 走看看