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
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 一的更多相关文章
- golang文件传输服务
续上篇,本篇介绍一个完整的golang文件传输服务器. 完整的代码可以看服务器,客户端 网络使用的框架如上篇介绍,这里就不再复述. 首先定义3个命令码: const ( request_file = ...
- GOLANG文件拷贝
GOLANG文件拷贝 在Golang中,使用系统自带函数io.Copy() 如: srcFile := "C:/Users/Wisdom/Desktop/Wisdompic.png" ...
- 标准io与文件io
A: 代码重复: 语句块1: while(判断) { 语句块2: 语句块1: } 上面可以改写为: while(1) { 语句块1: if(判断) break: 语句块2: } B: 标准IO和文件I ...
- 文件IO函数和标准IO库的区别
摘自 http://blog.chinaunix.net/uid-26565142-id-3051729.html 1,文件IO函数,在Unix中,有如下5个:open,read,write,lsee ...
- 转 漫谈linux文件IO
在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用 ...
- (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- Java文件IO操作应该抛弃File拥抱Paths和Files
Java7中文件IO发生了很大的变化,专门引入了很多新的类: import java.nio.file.DirectoryStream;import java.nio.file.FileSystem; ...
- Java 文件IO续
文件IO续 File类 用来将文件和文件夹封装成对象 方便对文件和文件夹的属性信息进行操作 File对象可以作为参数传递给流的构造函数 Demo1 File的构造方法 public cla ...
- Java 文件IO
文件IO Java IO IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的对象都在IO包中 按操作数据分为 字节流和字符流 字符流的 ...
随机推荐
- [epub] epub.js的ePubReader函数报URI malformed错误的解决办法
报错信息:URI malformed 今天遇到了一个奇怪的问题折腾三个小时,最后发现是作者在底层使用了decodeURIComponent进行URL解码,而我在应用层使用了escape/unescap ...
- DOM操作中,遍历动态集合的注意事项。ex: elem.children
elem.childNodes和elem.children返回的都是动态集合. 动态集合(live collection): 不实际存储元素和属性值 每次访问集合都重新查找DOM树 遍历动态集合: ...
- 《Linux命令行与shell脚本编程大全》第十九章 初识sed和gawk
这两个工具能够极大简化需要进行的数据处理任务. 19.1 文本处理 能轻松实现自动格式化.插入.修改或删除文本元素的简单命令行编辑. sed和gawk就具备上述功能 19.1.1 sed编辑器 被称为 ...
- Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)
目录 SignalR系列目录(注意,是ASP.NET的目录.不是Core的) 前言 一晃一个月又过去了,上个月有个比较大的项目要验收上线.所以忙的脚不沾地.现在终于可以忙里偷闲,写一篇关于Signal ...
- Etcd全套安装教程
一.安装 1.1 二进制安装 从这里下载: etcd-v3.2.11-linux-amd64.tar.gz 下载包后解压即可运行: # 解压 tar zxvf etcd-v3.2.11-linux-a ...
- 为什么要初始化CSS?
因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面显示差异. 当然,初始化样式会对SEO有一定的影响,但鱼和熊掌不可兼得,但力求影响最小的情况下 ...
- PHP7类型约束
在PHP7之前,函数和类方法不需要声明变量类型,任何数据都可以被传递和返回,导致几乎大部分的调用操作都要判断返回的数据类型是否合格. 为了解决这个问题,PHP7引入了类型声明. 目前有两类变量可以声明 ...
- 物联网设备是如何被破解的?分析一种篡改IoT固件内容的攻击方式
随着智能硬件进入到人们的生活,人们的生活质量开始有逐步的提高,人们与智能硬件之间的联系更加紧密.同时,智能硬件的安全问题也必须引起高度重视,因为其直接影响到人身安全.社会安全和国家安全. 大家是否 ...
- node-koa搭建MVC/RESTful API项目
本文将介绍如何基于node-koa搭建一个完整的mvc及restAPI的项目,项目封装了路由.模板引擎. 静态文件加载等基本功能:首先介绍项目的安装启动及目录结构说明,然后通过一个简单的登录页说明mv ...
- MyEclipse激活步骤
1.前言: MyEclipse 成功安装后使用天数仅仅有30天,打开软件后常常会弹出提醒我们在5天内要激活的对话框.没有激活的话,时间一到就不能使用了. 众所周知,中国的软件是不用花钱的,这里就介 ...