您的位置:首页 > 编程语言 > Go语言

Go语言学习(九)文件操作

2016-03-27 21:08 701 查看

1.相关api介绍

1.1建立File内存地址api

//返回File的内存地址,错误信息,通过os库调用
func Create(name string) (file *File, err Error)
//返回文件的内存地址,通过os库调用
func NewFile(fd int, name string) *File


1.2打开文件api

//返回File的内存地址,错误信息,通过os库调用
func Open(name string)(file *File,err Error)
//返回File的内存地址,错误信息,通过os库调用
func OpenFile(name string,flag int,perm unit32)(file *File,err Error)


1.3写文件api

//写入一个slice,返回写的个数,错误信息,通过File的内存地址调用
func (file *File)Write(b []byte)(n int,err Error)
//从slice的某个位置开始写入,返回写的个数,错误信息,通过File的内存地址调用
func (file *File)WriteAt(b []byte,off int64)(n int,err Error)
//写入一个字符串,返回写的个数,错误信息,通过File的内存地址调用
func (file *File) WriteString(s string)(ret int,err Error)


1.4读文件api

//读取一个slice,返回读的个数,错误信息,通过File的内存地址调用
func (file *File) Read(b []byte)(n int, err Error)
//从slice的某个位置开始读取,返回读到的个数,错误信息,通过File的内存地址调用
func (file *File) ReadAt(b []byte,off int64)(n int,err Error)


1.5删除文件api

//传入文件的路径来删除文件,返回错误个数
func Remove(name string) Error


2.写文件的实例代码

package main

import (
"fmt"
"os"
)

func main() {
userFile := "d:/test.txt" //文件路径
fout,err := os.Create(userFile) //根据路径创建File的内存地址
defer fout.Close() //延迟关闭资源
if err != nil{
fmt.Println(userFile,err)
return
}
//循环写入数据到文件
for i:=0;i<10;i++{
fout.WriteString("Hello world!\r\n") //写入字符串
fout.Write([]byte("abcd!\r\n"))//强转成byte slice后再写入
}
}


输出的文件内容:

Hello world!
abcd!
Hello world!
abcd!
Hello world!
abcd!
Hello world!
abcd!
Hello world!
abcd!
Hello world!
abcd!
Hello world!
abcd!
Hello world!
abcd!
Hello world!
abcd!
Hello world!
abcd!


3.读文件的实例代码

package main

import (
"fmt"
"os"
)

func main() {
userFile := "d:/test.txt" //文件路径
fin,err := os.Open(userFile) //打开文件,返回File的内存地址
defer fin.Close() //延迟关闭资源
if err != nil{
fmt.Println(userFile,err)
return
}
buf := make([]byte,1024)//创建一个初始容量为1024的slice,作为缓冲容器
for{
//循环读取文件数据到缓冲容器中,返回读取到的个数
n,_ := fin.Read(buf)

if 0==n{
break //如果读到个数为0,则读取完毕,跳出循环
}
//从缓冲slice中写出数据,从slice下标0到n,通过os.Stdout写出到控制台
os.Stdout.Write(buf[:n])
}
}


运行结果:

G:\GoCodeHome\demo\bin>go build demo4

G:\GoCodeHome\demo\bin>demo4
Hello world! abcd! Hello world! abcd! Hello world! abcd! Hello world! abcd! Hello world! abcd! Hello world! abcd! Hello world! abcd! Hello world! abcd! Hello world! abcd! Hello world! abcd!


4.同时使用os.Open和os.Create操作文件

package main

import (
"io"
"os"
)

func main() {
fi, err := os.Open("d:/input.txt")//打开输入*File
if err != nil { panic(err) }
defer fi.Close()

fo, err := os.Create("d:/output.txt")//创建输出*File
if err != nil { panic(err) }
defer fo.Close()

buf := make([]byte, 1024)
for {
n, err := fi.Read(buf)//从input.txt读取
if err != nil && err != io.EOF { panic(err) }
if n == 0 { break }

if n2, err := fo.Write(buf[:n]); err != nil {//写入output.txt,直到错误
panic(err)
} else if n2 != n {
panic("error in writing")
}
}
}


5.使用bufio库

package main

import (
"bufio"
"io"
"os"
)

func main() {
fi, err := os.Open("input.txt")//打开输入*File
if err != nil { panic(err) }
defer fi.Close()
r := bufio.NewReader(fi)//创建一个读取缓冲流

fo, err := os.Create("output.txt")//创建输出*File
if err != nil { panic(err) }
defer fo.Close()
w := bufio.NewWriter(fo)//创建输出缓冲流

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

if n2, err := w.Write(buf[:n]); err != nil {
panic(err)
} else if n2 != n {
panic("error in writing")
}
}

if err = w.Flush(); err != nil { panic(err) }
}


6.使用ioutil库

package main

import (
"io/ioutil"
)

func main() {
b, err := ioutil.ReadFile("input.txt")//读文件
if err != nil { panic(err) }

err = ioutil.WriteFile("output.txt", b, 0644)//写文件
if err != nil { panic(err) }
}


7.遍历文件夹

package main
import (
"path/filepath"
"os"
"fmt"
"flag"
)

func getFilelist(path string) {
err := filepath.Walk(path, func(path string, f os.FileInfo, err error) error {
if ( f == nil ) {return err}
if f.IsDir() {return nil}
println(path)
return nil
})
if err != nil {
fmt.Printf("filepath.Walk() returned %v\n", err)
}
}

func main(){
flag.Parse()
root := flag.Arg(0)
getFilelist(root)
}


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: