操作文件是任何编程语言都绕不过,要掌握一门语言,知道如何操作文件是必不可少的,今天学习了下golang对文件操作的支持。
golang对文件的支持是在os package里。我无意将本文写成官方文档的模样,我只是想讨论如何利用这些接口操作文件。
OPEN
funcOpenFile(namestring,flagint,permFileMode)(file*File,errerror)
我们看到了也有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,0660) if(err!=nil){ panic("openfileFailed") } deferf.Close() ...
READ和WRITE
接口如下
func(f*File)Read(b[]byte)(nint,errerror) func(f*File)ReadAt(b[]byte,offint64)(nint,errerror) func(f*File)Write(b[]byte)(nint,errerror) func(f*File)WriteAt(b[]byte,errerror) func(f*File)WriteString(sstring)(retint,errerror)
看到代码片段,学习使用读写接口:
read_buf:=make([]byte,32) varposint64=0 for{ n,err:=f.ReadAt(read_buf,pos) iferr!=nil&&err!=io.EOF{ panic(err) } ifn==0{ fmt.Printf("\nfinishread\n") break } fmt.Printf("%s",string(read_buf[:n])) pos=pos+(int64)(n) }
在看一个代码片段:
varbuff=make([]byte,1024) for{ n,err:=fi.Read(buff) iferr!=nil&&err!=io.EOF{ panic(err) } ifn==0{ break } if_,err:=fo.Write(buff[:n]);err!=nil{ panic(err) } }
packagemain import"fmt" import"os" import"io" funcusage(){ fmt.Printf("%s%s%s\n",os.Args[0],"filename","newfile") } funcmain(){ iflen(os.Args)!=3{ usage() return } filename_in:=os.Args[1] fi,err:=os.Open(filename_in) iferr!=nil{ panic(err) } deferfi.Close() filename_out:=os.Args[2] fo,err:=os.Create(filename_out) iferr!=nil{ panic(err) } deferfo.Close() varbuff=make([]byte,err:=fo.Write(buff[:n]);err!=nil{ panic(err) } } }
执行结果
manu@manu-hacks:~/code/go/self$./mycptest.txttest.bak manu@manu-hacks:~/code/go/self$difftest.txttest.bak manu@manu-hacks:~/code/go/self$cattest.txt thisistestfilecreatedbygo ifnotexisted,pleasecreatethisfile ifexisted,Pleasewriteappend helloworld,hellogo thisistestfilecreatedbygo ifnotexisted,hellogo原文链接:https://www.f2er.com/go/190250.html