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. Numpy入门 - 数组聚合运算

    本节主要讲解numpy的几个常用的聚合运算,包括求和sum.求平均mean和求方差var. 一.求和sum import numpy as np arr = np.array([[1, 2, 3], ...

  2. [全排列]--A Number Puzzle

    标签: ACM Lele 最近上课的时候都很无聊,所以他发明了一个数字游戏来打发时间. 这个游戏是这样的,首先,他拿出几张纸片,分别写上0到9之间的任意数字(可重复写某个数字),然后,他叫同学随便写两 ...

  3. 爬起点小说day03

    # 把所有类别的前3页的小说爬取下来 import scrapyfrom scrapy.http import Requestfrom time import sleepfrom qidianNove ...

  4. 查找算法(Java实现)

    1.二分查找算法 package other; public class BinarySearch { /* * 循环实现二分查找算法arr 已排好序的数组x 需要查找的数-1 无法查到数据 */ p ...

  5. Ubuntu 环境 TensorFlow (最新版1.4) 源码编译、安装

    Ubuntu 环境 TensorFlow 源码编译安装 基于(Ubuntu 14.04LTS/Ubuntu 16.04LTS/) 一.编译环境 1) 安装 pip sudo apt-get insta ...

  6. Linux正则表达式语法

    基本组成部分: 正则表达式的基本组成部分. 正则表达式 描述 示例 \ 转义符,将特殊字符进行转义,忽略其特殊意义 a\.b匹配a.b,但不能匹配ajb,.被转义为特殊意义 ^ 匹配行首,awk中,^ ...

  7. .NET Core快速入门教程 2、我的第一个.NET Core App(Windows篇)

    一.前言 本篇开发环境?1.操作系统: Windows 10 X642.SDK: .NET Core 2.0 Preview 二.安装 .NET Core SDK 1.下载 .NET Core下载地址 ...

  8. CORS预检请求详谈

    引言 最近在项目中因前后端部署不同地方,前端在请求后端api时发生了跨域请求,我们采用CORS(跨域资源共享)来解决跨域请求,这需要前后端的配合来完成.在这一过程中,后端支持了CORS跨域请求后,前端 ...

  9. [亲测]ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问

    前言 ASP.NET Core 2.0 怎么发布到Ubuntu服务器?又如何在服务器上配置使用ASP.NET Core网站绑定到指定的域名,让外网用户可以访问呢? 步骤 第1步:准备工作 一台Liun ...

  10. AspNet Core 初步认识

    Core 的出现对我我没有很大的影响,当时在Core要发布的时候听到周围的人再聊再谈,我没有去太多关注,就是一个屌丝开发人员. 直到又一次偶然见到一位特别喜欢.net的老开发人员谈起Core时落泪了, ...