Go语言文件操作

时间:2023-02-25 16:38:52

更多用法,参考GO语言标准库

获取文件信息

os.Stat()函数,返回fileInfo和err信息。

func main() {
fileInfo, err := os.Stat("xx/test.txt")
if err != nil {
fmt.Println("get info err", err)
return //将函数返回
}
//获取文件名
fmt.Println(fileInfo.Name()) //test.txt
//获取文件大小
fmt.Println(fileInfo.Size()) //540
//是否为目录
fmt.Println(fileInfo.IsDir()) //false
//修改时间
fmt.Println(fileInfo.ModTime()) //2019-08-28 11:28:33.405318773 +0800 CST
//权限
fmt.Println(fileInfo.Mode()) //-rw-r--r--
}

打开和关闭文件

os.Open()函数能够打开一个文件,返回一个*File和一个err,通过此种方式打开文件是只读的。
file.close()方法能够关闭文件。

//打开和关闭文件
func main() {
file,err := os.Open("test.txt")
if err != nil{
fmt.Println("打开文件失败",err)
return
}
//文件能打开的情况下,使用defer延迟关闭文件
defer file.Close()
}

读取文件

基本使用

file.Read()方法可以读取文件,它接收一个字节切片,返回读取的字节数和可能的具体错误,读到文件末尾时会返回0和io.EOF。
定义:

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

type Reader interface {
Read(p []byte) (n int, err error)
}

示例:

func main() {
//打开文件
f,err := os.Open("woceng.txt")
if err!= nil{
fmt.Println("文件打开失败",err)
return
}
//关闭文件
defer f.Close()
//读取文件
var geci = make([]byte,256)
g,err := f.Read(geci)
if err == io.EOF{
fmt.Println("文件读取完毕!")
return
}
if err!= nil{
fmt.Println("文件打开失败",err)
return
}
//只会读取之前切片定义的256字节数据,若文件内容大于256字节,则超出部分无法显示
fmt.Printf("读取了%d字节数据\n", g)
fmt.Println(string(geci[:g])) //将byte转换成string
}

循环读取

使用for循环读取。

var geci = make([]byte,256)
for {
g,err := f.Read(geci)
if err == io.EOF{
fmt.Println("文件读取完毕!")
return
}
if err!= nil{
fmt.Println("文件打开失败",err)
return
}
//会全部读取,但是每256字节会进行重新读取,可能会出现乱码
fmt.Printf("读取了%d字节数据\n", g)
fmt.Println(string(geci[:g]))
}

bufio读取文件

读取文件中会有个缓冲区,先把内容读到缓冲区,然后统一读取,不过可能会丢数据(内存)。

func main()  {
file,err := os.Open("woceng.txt")
if err != nil{
fmt.Println("文件读取错误",err)
return
}
defer file.Close()
// 利用缓冲区从文件读数据
reader := bufio.NewReader(file)
for{
line,err := reader.ReadString('\n') //字符串读取,每到换行就停止
if err == io.EOF {
fmt.Println("文件读完了")
break
}
if err != nil {
fmt.Println("read file failed, err:", err)
return
}
fmt.Print(line)
}
}

ioutil读取整个文件

ReadFile方法能够读取完整的文件,只需要将文件名作为参数传入。

// ioutil读取文件
func readioutil(filename string) {
content,err := ioutil.ReadFile(filename)
if err != nil{
fmt.Println("文件读取错误",err)
return
}
fmt.Println(string(content))
}

文件写入

os.OpenFile()方法实现文件写入相关功能。
语法:

func OpenFile(name string, flag int, perm FileMode) (*File, error) {
...
}
type Writer interface {
Write(p []byte) (n int, err error)
}

name:要打开的文件名
flag:打开文件的模式
perm:文件权限,一个八进制数

模式 含义
os.O_WRONLY 只写
os.O_CREATE 创建文件
os.O_RDONLY 只读
os.O_RDWR 读写
os.O_TRUNC 清空
os.O_APPEND 追加

Write和WriteString

//打开文件支持文件写入
func main() {
file,err := os.OpenFile("test.txt",os.O_CREATE|os.O_APPEND|os.O_WRONLY,0644)
if err != nil{
fmt.Println("打开文件失败",err)
return
}
defer file.Close()
str := "ares"
file.Write([]byte("666\n")) //写入字节切片数据
file.WriteString(str) //直接写入字符串数据
}

bufio.NewWriter

将数据先写入缓存。

//打开文件支持文件写入
func main() {
file,err := os.OpenFile("test.txt",os.O_CREATE|os.O_APPEND|os.O_WRONLY,0644)
if err != nil{
fmt.Println("打开文件失败",err)
return
}
defer file.Close()
writer := bufio.NewWriter(file)
for i := 0;i<10;i++{
writer.WriteString("heoolo\n") ////将数据先写入缓存
}
writer.Flush() //将缓存中的内容写入文件
}

ioutil.WriteFile

将内容直接写入文件中,避免了打开文件操作。直接覆盖文件内容

func main()  {
str := "aresares"
err := ioutil.WriteFile("test.txt",[]byte(str),0644)
if err != nil{
fmt.Println("写文件失败",err)
return
}
}

ioutil.ReadDir实现文件目录遍历

func listFiles(dirname string, level int) {
// level用来记录当前递归的层次
s := "--" //生成空格
for i := 0; i < level; i++ {
s = "| " + s
}
fileInfos, err := ioutil.ReadDir(dirname)
if err != nil {
fmt.Println("err:", err)
}
for _, fi := range fileInfos {
filename := dirname + "/" + fi.Name()
fmt.Printf("%s%s\n", s, filename)
if fi.IsDir() {
listFiles(filename, level+1)
}
} }
func main() {
//目录遍历
dirname := "/Users/wangxin/Documents"
listFiles(dirname, 0)
}

文件复制

package main

import (
"fmt"
"io"
"io/ioutil"
"os"
) func main() {
srcFile := "xx/src.txt"
destFile := "xx/dest1.txt"
total, err := CopyFile(srcFile, destFile)
fmt.Println(total, err)
total1, err := CopyFile1(srcFile, destFile)
fmt.Println(total1, err)
total2, err := CopyFile3(srcFile, destFile)
fmt.Println(total2, err)
} //使用io.Copy()方法实现拷贝,返回拷贝的总数量,错误
func CopyFile(srcFile, destFile string) (int64, error) {
file1, err := os.Open(srcFile)
if err != nil {
return 0, err
}
file2, err := os.OpenFile(destFile, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
if err != nil {
return 0, err
}
defer file1.Close()
defer file2.Close()
return io.Copy(file2, file1)
} //通过io操作实现文件拷贝,返回拷贝的总数量及错误
func CopyFile1(srcFile, destFile string) (int, error) {
file1, err := os.Open(srcFile)
if err != nil {
return 0, err
}
file2, err := os.OpenFile(destFile, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
if err != nil {
return 0, err
}
defer file1.Close()
defer file2.Close()
//读写
str := make([]byte, 100, 100) //拷贝的时间与此处定义的大小有关
n := -1 //读取的数据量
total := 0
for {
n, err = file1.Read(str)
if err == io.EOF || n == 0 {
fmt.Println("拷贝结束!")
break
} else if err != nil {
fmt.Println("copy err", err)
return total, err
}
total += n
file2.Write([]byte("\n"))
file2.Write(str[:n])
}
return total, nil
} //通过ioutil操作实现文件拷贝,返回拷贝的总数量及错误,不适用大文件
func CopyFile3(srcFile, destFile string) (int, error) {
str, err := ioutil.ReadFile(srcFile)
if err != nil {
return 0, err
}
err = ioutil.WriteFile(destFile, str, 0644)
if err != nil {
return 0, err
}
return len(str), nil
}

断点续传

Seeker接口

type Seeker interface {
Seek(offset int64, whence int) (int64, error)
}

offset:设置偏移量
whence:

  • 0:seekStart表示相对于文件开始,
  • 1:seekCurrent表示相对于当前偏移量,
  • 2:seek end表示相对于结束。
func main() {
file, _ := os.OpenFile("xx/file01/src.txt", os.O_RDWR, 0644)
defer file.Close()
//创建一个切片
str := []byte{0}
file.Read(str)
fmt.Println(string(str)) //A
file.Seek(2, io.SeekStart) //相对文件开始从下标为2的位置开始读取文件
file.Read(str)
fmt.Println(string(str)) //C
file.Seek(3, io.SeekCurrent) //相对于当前位置(下标为2)往后3个偏移量位置读取文件
file.Read(str)
fmt.Println(string(str)) //G
file.Seek(2, io.SeekEnd) //相对于文件末尾,写入文件
file.WriteString("QWE") //会在文件末尾写入QWE
}

断点续传实现

创建一个临时文件,记录已经传递的数据量,当恢复传递的时候,先从临时文件中读取上次已经传递的数据量,然后通过Seek()方法,设置到该读和该写的位置,再继续传递数据。

//定义一个错误处理函数
func HandleErr(err error) {
if err != nil {
fmt.Println(err)
}
}
func main() {
srcFile := "xx/src.txt"
destFile := "xx/src1.txt"
//destFile := srcFile[strings.LastIndex(srcFile, "/")+1:] + "dest.txt" //获取源文件名
tempFile := destFile + "tmp.txt" //临时文件
//fmt.Println(srcFile)
//fmt.Println(destFile)
//fmt.Println(tempFile)
file1, err := os.Open(srcFile)
HandleErr(err)
file2, err := os.OpenFile(destFile, os.O_CREATE|os.O_WRONLY, 0644)
HandleErr(err)
file3, err := os.OpenFile(tempFile, os.O_CREATE|os.O_RDWR, 0644)
HandleErr(err)
defer file1.Close()
defer file2.Close()
//读取临时文件中的数据
file3.Seek(0, io.SeekStart)
//创建切片存储临时文件数据
bs := make([]byte, 100, 100)
n1, err := file3.Read(bs)
HandleErr(err)
fmt.Println(n1)
countStr := string(bs[:n1]) //获取临时文件的数据
couunt, _ := strconv.ParseInt(countStr, 10, 64) //将数据转为10进制64位数据
fmt.Println(couunt)
//设置读写的偏移量
file1.Seek(couunt, io.SeekStart)
file2.Seek(couunt, io.SeekStart)
data := make([]byte, 1024, 1024)
n2 := -1 //读的数据量
n3 := -1 //写的数据量
total := int(couunt) //读取总量
//读取数据
for {
n2, err = file1.Read(data)
if err == io.EOF || n2 == 0 {
fmt.Println("复制完毕、、")
file3.Close()
//删除临时文件
os.Remove(tempFile)
break
}
//将数据写入目标文件
n3, _ = file2.Write(data[:n2])
total += n3
//将复制总量,存储到临时文件中
file3.Seek(0, io.SeekStart)
file3.WriteString(strconv.Itoa(total))
}
}

Go语言文件操作的更多相关文章

  1. go语言文件操作,这期资料比较详细&lpar; 欢迎加入go语言群: 218160862 &rpar;

    go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 点击加入 文件操作 func Open(name string) (file *File ...

  2. C语言文件操作

    C语言文件操作,以下以基本的例子和说明来展开怎么通过C语言来进行文件操作. 操作文件,我们得需要知道什么?当然是路径和文件名. 首先我需要知道我操作的文件在哪里,叫什么名字.在C语言中还存在一个打开方 ...

  3. C 语言文件操作

    C 语言文件操作 1. 数据流:     程序与数据的交互以流的形式进行.fopen 即打开数据流,fclose 即刷新数据流.     所谓数据流,是一种抽象,表示这段数据像流一样,需要逐步接收,不 ...

  4. C语言文件操作函数

    C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * str ...

  5. C语言文件操作解析&lpar;五&rpar;之EOF解析&lpar;转载&rpar;

      C语言文件操作解析(五)之EOF解析 在C语言中,有个符号大家都应该很熟悉,那就是EOF(End of File),即文件结束符.但是很多时候对这个理解并不是很清楚,导致在写代码的时候经常出错,特 ...

  6. 【转】C语言文件操作解析&lpar;三&rpar;

    原文网址:http://www.cnblogs.com/dolphin0520/archive/2011/10/07/2200454.html C语言文件操作解析(三) 在前面已经讨论了文件打开操作, ...

  7. C语言文件操作函数大全&lpar;超详细&rpar;

    C语言文件操作函数大全(超详细) 作者: 字体:[增加 减小] 类型:转载 本篇文章是对C语言中的文件操作函数进行了详细的总结分析,需要的朋友参考下   fopen(打开文件)相关函数 open,fc ...

  8. C语言文件操作 FILE结构体

    内存中的数据都是暂时的,当程序结束时,它们都将丢失.为了永久性的保存大量的数据,C语言提供了对文件的操作. 1.文件和流 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特 ...

  9. C语言文件操作相关函数

    在实际应用中,我们往往需要对文件进行操作,下面我将介绍C语言的一些关于操作文件的函数. 一.计算机文件 计算机文件是以计算机硬盘为载体存储在计算机上的信息集合,是存储在某种长期储存设备上的一段数据流. ...

  10. 关于C语言文件操作

    关于C语言的文件操作之前我也写过一篇博客来介绍,但是当时写的很不全面,只是简单的使用了一下 ,今天再从新学习一下. 1.文件的写 首先还是先看一个简单的例子: include<stdio.h&g ...

随机推荐

  1. JavaScript多文件下载

    对于文件的下载,可以说是一个十分常见的话题,前端的很多项目中都会有这样的需求,比如 highChart 统计图的导出,在线图片编辑中的图片保存,在线代码编辑的代码导出等等.而很多时候,我们只给了一个链 ...

  2. js的包管理工具bower安装

    bower需要:node 和 git node安装包下载:http://blog.csdn.net/myan/article/details/2028545 Git安装: 选择第二项:Use Git ...

  3. ajax执行完成后,再执行下面的代码的解决办法

    一般ajax设置的都是异步的,但是有时候我们有这种需求,就是等ajax执行完成之后,在执行下面的函数. 1设置async:false 在jq中直接设置了ajax是异步的还是同步的 一般如果不写这个,默 ...

  4. 如何设置NBU的Backup&comma; Archive and Restore

    第一行表示Master Server 第二行猜测表示当前主机 第三行不清楚   总结: 1. 这里压根就没有Media Server的事, Media Server对整个备份系统来说是透明的. 2. ...

  5. docker 实战---使用oracle xe作为开发数据库&lpar;六)

    oracle作为oltp的大佬,非常多行业应用都会用到它.那么在开发的过程中就不可避免的要使用oracle数据库,oracle数据库的版本号有好多,当中express版本号是免费的开发版.它的主要限制 ...

  6. 获取Winform窗体、工作区 宽度、高度、命名空间、菜单栏高度等收集

    MessageBox.Show("当前窗体标题栏高"+(this.Height - this.ClientRectangle.Height).ToString());//当前窗体标 ...

  7. ZOJ 3927 Programming Ability Test

    水题,判断一下加起来是否大于等于80 #include<cstdio> #include<cstring> #include<cmath> #include< ...

  8. 初识Avro

    Avro是Hadoop生态圈的一部分,由Hadoop的创始人Doug Cutting牵头开发,当前最新版本1.8.2.Avro是一个数据序列化系统,设计用于支持大批量数据交换的应用.它的主要特点有: ...

  9. SSH框架学习摸索记

    Unable to load configuration. - bean - jar:file:/E:/tomcat-7.0.11/webapps/struts/WEB-INF/lib/struts ...

  10. 血液检测 &amp&semi; 创业骗局

    血液检测 & 创业骗局 硅谷血液检测公司 Theranos http://www.sohu.com/a/236659372_100053377 https://www.jianshu.com/ ...