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

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

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

WriteFile将data写入到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,"","\t")

    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:\Go\src\os\types.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权限指定为0777,Ubuntu上执行上面的例子,查看app.cfg的详细信息

dell@dell-VirtualBox:~/mygo/src/example/ioutil$ ll app.cfg

-rwxrwxr-x  dell dell  11月  : app.cfg*

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

dell@dell-VirtualBox:~/mygo/src/example/ioutil$ ll app.cfg

-rw-rw-r--  dell dell  11月  : app.cfg

Golang文件IO 一的更多相关文章

  1. golang文件传输服务

    续上篇,本篇介绍一个完整的golang文件传输服务器. 完整的代码可以看服务器,客户端 网络使用的框架如上篇介绍,这里就不再复述. 首先定义3个命令码: const ( request_file = ...

  2. GOLANG文件拷贝

    GOLANG文件拷贝 在Golang中,使用系统自带函数io.Copy() 如: srcFile := "C:/Users/Wisdom/Desktop/Wisdompic.png" ...

  3. 标准io与文件io

    A: 代码重复: 语句块1: while(判断) { 语句块2: 语句块1: } 上面可以改写为: while(1) { 语句块1: if(判断) break: 语句块2: } B: 标准IO和文件I ...

  4. 文件IO函数和标准IO库的区别

    摘自 http://blog.chinaunix.net/uid-26565142-id-3051729.html 1,文件IO函数,在Unix中,有如下5个:open,read,write,lsee ...

  5. 转 漫谈linux文件IO

    在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用 ...

  6. (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  7. Java文件IO操作应该抛弃File拥抱Paths和Files

    Java7中文件IO发生了很大的变化,专门引入了很多新的类: import java.nio.file.DirectoryStream;import java.nio.file.FileSystem; ...

  8. Java 文件IO续

    文件IO续 File类    用来将文件和文件夹封装成对象 方便对文件和文件夹的属性信息进行操作    File对象可以作为参数传递给流的构造函数 Demo1 File的构造方法 public cla ...

  9. Java 文件IO

    文件IO Java IO    IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的对象都在IO包中    按操作数据分为 字节流和字符流        字符流的 ...

随机推荐

  1. 03.redis与ssm整合(mybatis二级缓存)

    SSM+redis整合 ssm框架之前已经搭建过了,这里不再做代码复制工作. 这里主要是利用redis去做mybatis的二级缓存,mybaits映射文件中所有的select都会刷新已有缓存,如果不存 ...

  2. 有关BOM头的一些知识

    在psr开发标准中,有一条是讲的,php只能使用无bom的utf8格式 . 那么这个bom是几个意思.  说一些理论内容 . 在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK ...

  3. 整理下git常用命令

    Git工作示意图 一.新建代码库 ::在当前目录新建一个Git代码库git init::新建一个目录,将其初始化为Git代码库git init [project-name]::下载一个项目和它的整个代 ...

  4. php结合redis实现秒杀功能

    <?php 第一种,简单实现 $conn=mysql_connect("localhost","big","123456"); if( ...

  5. 配置scrapy-splash+python爬取医院信息(利用了scrapy-splash)

    北京艾丽斯妇科医院(http://fuke.fuke120.com/) 首先先说一下配置splash 1.利用pip安装scrapy-splash库 pip install scrapy-splash ...

  6. 封装及propery的使用

    封装 封装的目的 使类中的属性或者方法只允许在类内部使用,不允许外部对其访问,保证数据的安全性. 封装的方法 使属性或者函数名改写成:"__属性名或者函数名"的格式,即完成了对本类 ...

  7. zkw模板

    水平有限,前缀和的前缀和什么的,rbq 两个操作: 1.区间l到r加上一个数x 2.查询区间[l,r]的区间和 #include<iostream> #include<cstdio& ...

  8. NavMesh--导航网格寻路

    一.概述: NavMesh是3D游戏世界中用于实现动态物体自动寻路的一种技术,他将游戏场景中复杂的结构组织关系简化为带有一定信息的网格, 进而在这些网格的基础上通过一些列的计算来实现自动寻路. 二.简 ...

  9. Object-Relational Structural Patterns

    Single Table Inheritance Represents an inheritance hierarchy of classes as a single table that has c ...

  10. 八皇后問題 (C語言递归實現 回溯法)

    八皇后问题是一个以国际象棋为背景的问题:怎样可以在 8×8 的国际象棋棋盘上放置八个皇后,使得不论什么一个皇后都无法直接吃掉其它的皇后?为了达到此目的.任两个皇后都不能处于同一条横行.纵行或斜线上.現 ...