文档章节

golang 文件操作

冷絮
 冷絮
发布于 2015/08/25 20:53
字数 609
阅读 171
收藏 0

       操作文件是任何编程语言都绕不过,要掌握一门语言,知道如何操作文件是必不可少的,今天学习了下golang对文件操作的支持。

    golang对文件的支持是在os package里。我无意将本文写成官方文档的模样,我只是想讨论如何利用这些接口操作文件。

    OPEN

func OpenFile(name string, flag int, perm FileMode) (file *File, err error)

   我们看到了也有flag,也有FileMode.比如说我要读写打开一个文件,如果不存在就创建,如果存在,就追加写,如何写go 代码?

f,err := os.OpenFile("test.txt",os.O_CREATE|os.O_APPEND|os.O_RDWR,0660)
    if(err != nil){
        panic(err)
    }

 CLOSE

 这个接口无甚好说。接口如下

func (f *File) Close() error

    但说接口没啥说的,但是golang提供了defer,这是一个我认为很赞的特点,就是将不得不做的cleanup放到defer去做。go提供了defer解决这种困境,后面不用时刻惦记close,函数退出前,会执行close

f,err := os.OpenFile("test.txt",os.O_CREATE|os.O_APPEND|os.O_RDWR,0660)
    if(err != nil){
        panic("open file failed")
    }
    defer f.Close()
    ...

 READ和WRITE

 接口如下

func (f *File) Read(b []byte) (n int, err error)
func (f *File) ReadAt(b []byte, off int64) (n int, err error)

func (f *File) Write(b []byte) (n int, err error)
func (f *File) WriteAt(b []byte, off int64) (n int, err error)
func (f *File) WriteString(s string) (ret int, err error)

 看到代码片段,学习使用读写接口:

read_buf := make([]byte,32)
    var pos int64 = 0
    for{

        n,err := f.ReadAt(read_buf,pos)
        if err != nil && err != io.EOF{
            panic(err)
        }
        if n == 0{
            fmt.Printf("\nfinish read\n")
            break
        }
        fmt.Printf("%s",string(read_buf[:n]))
        pos = pos +(int64)(n)
    }

  在看一个代码片段:

 var buff = make([]byte,1024)
    for{
        n,err := fi.Read(buff)
        if err != nil && err != io.EOF{
            panic(err)
        }
        
        if n == 0{
            break
        }

        if _,err := fo.Write(buff[:n]); err != nil{
            panic(err)
        }

    }

  最后,我写了一个完整的代码,完成简单cp功能,就叫mycp

package main
import "fmt"
import "os"
import "io"

func usage(){
    fmt.Printf("%s %s %s\n",os.Args[0],"filename" , "newfile")
}


func main(){
    
    if len(os.Args) != 3{
        usage()
        return 
    }

    filename_in := os.Args[1]
    fi,err := os.Open(filename_in)
    if err != nil{
        panic(err)
    }
    defer fi.Close()

    filename_out := os.Args[2]
    fo,err := os.Create(filename_out)
    if err != nil{
        panic(err)
    }
    defer fo.Close()


    var buff = make([]byte,1024)
    for{
        n,err := fi.Read(buff)
        if err != nil && err != io.EOF{
            panic(err)
        }
        
        if n == 0{
            break
        }

        if _,err := fo.Write(buff[:n]); err != nil{
            panic(err)
        }

    }
}

执行结果

manu@manu-hacks:~/code/go/self$ ./mycp test.txt test.bak
manu@manu-hacks:~/code/go/self$ diff test.txt test.bak 
manu@manu-hacks:~/code/go/self$ cat test.txt 
this is test file created by go
if not existed ,please create this file
if existed, Please write append
hello world,hello go
this is test file created by go
if not existed ,please create this file
if existed, Please write append
hello world,hello go


本文转载自:

冷絮
粉丝 0
博文 21
码字总数 1243
作品 0
济南
系统管理员
私信 提问
Golang学习笔记目录

Golang 介绍 Go语言是谷歌2009发布的第二款开源编程语言。 Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。...

ChainZhang
2017/12/26
0
0
基于 Redis 的应用配置文件热更新工具 - GRC

GRC - golang redis config GRC是一款使用golang redis 对应用程序的配置文件进行热更新的一款软件,方便在应用程序启动的过程当中实时更新我们的配置文件。 使用 可以参考测试文件 //使用N...

ppmoon
2018/07/14
416
2
golang进阶(一)——glide的使用手册

+++ title=”golang进阶(一)——glide的使用手册” date=”2017-10-10” tags=[“golang”,”glide”,”docker”] categories=[“资源管理”] description=”golang也有包管理,类似maven...

lastsweetop
2017/10/09
0
0
golang入门学习笔记(四)

作者: 一字马胡 转载标志 【2017-11-25】 更新日志 日期 更新内容 备注 2017-11-25 新建文章 go语言入门学习笔记(四) golang入门学习笔记系列 golang入门学习笔记(一) golang入门学习笔...

一字马胡
2017/11/25
0
0
Golang 学习笔记(10)—— mysql操作

本文为转载,原文:Golang 学习笔记(10)—— mysql操作 Golang go-sql-driver/mysql go操作mysql的驱动包很多,这里讲解当下比较流行的go-sql-driver/mysql 安装 执行下面两个命令: 安装完...

ChainZhang
2018/01/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

uni app 零基础小白到项目实战

$emit 子组件传给父组件$ref 父组件操作子组件 公用模板 uni-app全局变量的几种实现方法 const websiteUrl = 'http'const now = Date.now || function() { return new Date().getTime......

达达前端小酒馆
19分钟前
4
0
Tomcat是如何实现异步Servlet的

前言 通过我之前的Tomcat系列文章,相信看我博客的同学对Tomcat应该有一个比较清晰的了解了,在前几篇博客我们讨论了Tomcat在SpringBoot框架中是如何启动的,讨论了Tomcat的内部组件是如何设...

木木匠
43分钟前
16
0
mysql中间件分享(Mysql-prxoy,Atlas,DBProxy,Amoeba,cobar,TDDL)

hello 各位小伙伴大家好,我是小栈君,这期我们分享关于mysql中间件的研究,也就是数据层的读写分离和负载均衡,希望能够在实际的应用中能够帮助到各位小伙伴。 下期我们将继续分享go语言的系...

IT干货栈
今天
10
0
OSChina 周一乱弹 —— 人生,还真是到处是意外

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐# 分享lil peep的单曲《High School》 《High School》- lil peep 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
650
10
Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部