zoukankan      html  css  js  c++  java
  • Golang文件IO 一

    Golang文件IO

    文件IO编程最基本、最常用的就属读写文件操作了。ioutil包实现了一些IO实用功能,其中就包括非常简捷、好用的文件读取功能。

    ioutil包有7个函数1个变量:

    var Discard io.Writer = devNull(0)

    func NopCloser(r io.Reader) io.ReadCloser

    func ReadAll(r io.Reader) ([]byte, error)

    func ReadDir(dirname string) ([]os.FileInfo, error)

    func ReadFile(filename string) ([]byte, error)

    func TempDir(dir, prefix string) (name string, err error)

    func TempFile(dir, prefix string) (f *os.File, err error)

    func WriteFile(filename string, data []byte, perm os.FileMode) error

    ReadFileWriteFile这两个函数分别实现了读文件和写文件操作,一行代码即可搞定,非常便捷。

    func ReadFile(filename string) ([]byte, error)

    ReadFile读取filename指定的文件,返回文件的内容。如果调用成功返回err==nil,而不是err==EOF。因为ReadFile读取整个文件,不会将Read操作遇到的EOF报告为一个错误。

    func WriteFile(filename string, data []byte, perm os.FileMode) error

    WriteFiledata写入到filename指定的文件。如果文件不存在,WriteFile用权限perm创建文件;如果文件存在,WriteFile函数在写之前先将文件截断。

    可以搭配json包实现程序配置的读写功能。下面是一个读写数据库配置的例子。

    package main
    
     
    
    import (
    
        "fmt"
    
        "io/ioutil"
    
        "log"
    
        "encoding/json"
    
    )
    
     
    
    type AppConf struct{
    
        DriverName string `json:"driver_name"`
    
        SqlUser string `json:"sql_user"`
    
        SqlPass string `json:"sql_password"`
    
        SqlUrls string `json:"sql_urls"`
    
        SqlDB string `json:"sql_db"`
    
    }
    
     
    
    func main() {
    
        
    
        appConf := AppConf{DriverName:"mysql",
    
        SqlUser:"root",
    
        SqlPass:"password",
    
    SqlUrls:"tcp(127.0.0.1:3306)",
    
    SqlDB:"mydb"}
    
     
    
        bConf,err := json.MarshalIndent(appConf,"","	")
    
        if err != nil {
    
            log.Fatal(err)
    
        }
    
     
    
        err = ioutil.WriteFile("app.cfg",bConf,0666)
    
        if err != nil {
    
            log.Fatal(err)
    
        }
    
     
    
        var appConf2 AppConf
    
     
    
        bConf,err =ioutil.ReadFile("app.cfg")
    
        if err != nil {
    
            log.Fatal(err)
    
        }
    
     
    
        err = json.Unmarshal(bConf,&appConf2)
    
        if err != nil {
    
            log.Fatal(err)
    
        }
    
     
    
        fmt.Println("appConf === appConf2",appConf==appConf2)
    
    }
    

      

    运行结果如下:

     

    生成的app.cfg内容如下:

    {
    
        "driver_name": "mysql",
    
        "sql_user": "root",
    
        "sql_password": "password",
    
        "sql_urls": "tcp(127.0.0.1:3306)",
    
        "sql_db": "mydb"
    
    }
    

      

    通常WriteFile的权限是0666。关于权限的定义,可以查看golang源码(C:Gosrcos ypes.go)

    // A FileMode represents a file's mode and permission bits.
    
    // The bits have the same definition on all systems, so that
    
    // information about files can be moved from one system
    
    // to another portably. Not all bits apply to all systems.
    
    // The only required bit is ModeDir for directories.
    
    type FileMode uint32
    
     
    
    // The defined file mode bits are the most significant bits of the FileMode.
    
    // The nine least-significant bits are the standard Unix rwxrwxrwx permissions.
    
    // The values of these bits should be considered part of the public API and
    
    // may be used in wire protocols or disk representations: they must not be
    
    // changed, although new bits might be added.
    
    const (
    
        // The single letters are the abbreviations
    
        // used by the String method's formatting.
    
        ModeDir FileMode = 1 << (32 - 1 - iota) // d: is a directory
    
        ModeAppend // a: append-only
    
        ModeExclusive // l: exclusive use
    
        ModeTemporary // T: temporary file; Plan 9 only
    
        ModeSymlink // L: symbolic link
    
        ModeDevice // D: device file
    
        ModeNamedPipe // p: named pipe (FIFO)
    
        ModeSocket // S: Unix domain socket
    
        ModeSetuid // u: setuid
    
        ModeSetgid // g: setgid
    
        ModeCharDevice // c: Unix character device, when ModeDevice is set
    
        ModeSticky // t: sticky
    
     
    
        // Mask for the type bits. For regular files, none will be set.
    
        ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice
    
     
    
        ModePerm FileMode = 0777 // Unix permission bits
    
    )
    

      

    FileMode在所有系统种的定义相同,与linux系统的权限定义类似,一些可取的值包括如下:

      const (
    
            OS_READ = 04
    
            OS_WRITE = 02
    
            OS_EX = 01
    
            OS_USER_SHIFT = 6
    
            OS_GROUP_SHIFT = 3
    
            OS_OTH_SHIFT = 0
    
     
    
            OS_USER_R = OS_READ<<OS_USER_SHIFT
    
            OS_USER_W = OS_WRITE<<OS_USER_SHIFT
    
            OS_USER_X = OS_EX<<OS_USER_SHIFT
    
            OS_USER_RW = OS_USER_R | OS_USER_W
    
            OS_USER_RWX = OS_USER_RW | OS_USER_X
    
     
    
            OS_GROUP_R = OS_READ<<OS_GROUP_SHIFT
    
            OS_GROUP_W = OS_WRITE<<OS_GROUP_SHIFT
    
            OS_GROUP_X = OS_EX<<OS_GROUP_SHIFT
    
            OS_GROUP_RW = OS_GROUP_R | OS_GROUP_W
    
            OS_GROUP_RWX = OS_GROUP_RW | OS_GROUP_X
    
     
    
            OS_OTH_R = OS_READ<<OS_OTH_SHIFT
    
            OS_OTH_W = OS_WRITE<<OS_OTH_SHIFT
    
            OS_OTH_X = OS_EX<<OS_OTH_SHIFT
    
            OS_OTH_RW = OS_OTH_R | OS_OTH_W
    
            OS_OTH_RWX = OS_OTH_RW | OS_OTH_X
    
     
    
            OS_ALL_R = OS_USER_R | OS_GROUP_R | OS_OTH_R
    
            OS_ALL_W = OS_USER_W | OS_GROUP_W | OS_OTH_W
    
            OS_ALL_X = OS_USER_X | OS_GROUP_X | OS_OTH_X
    
            OS_ALL_RW = OS_ALL_R | OS_ALL_W
    
            OS_ALL_RWX = OS_ALL_RW | OS_GROUP_X)
    

      

    WriteFile权限指定为0777Ubuntu上执行上面的例子,查看app.cfg的详细信息

    dell@dell-VirtualBox:~/mygo/src/example/ioutil$ ll app.cfg
    
    -rwxrwxr-x 1 dell dell 132 11月 21 22:15 app.cfg*

    WriteFile 权限指定为0666Ubuntu上执行上面的例子,查看app.cfg的详细信息

    dell@dell-VirtualBox:~/mygo/src/example/ioutil$ ll app.cfg
    
    -rw-rw-r-- 1 dell dell 132 11月 21 22:18 app.cfg
  • 相关阅读:
    1082 射击比赛 (20 分)
    1091 N-自守数 (15 分)
    1064 朋友数 (20 分)
    1031 查验身份证 (15 分)
    1028 人口普查 (20 分)
    1059 C语言竞赛 (20 分)
    1083 是否存在相等的差 (20 分)
    1077 互评成绩计算 (20 分)
    792. 高精度减法
    791. 高精度加法
  • 原文地址:https://www.cnblogs.com/majianguo/p/7875686.html
Copyright © 2011-2022 走看看