Go语言文件操作
更多用法,参考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语言文件操作的更多相关文章
- go语言文件操作,这期资料比较详细( 欢迎加入go语言群: 218160862 )
go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 点击加入 文件操作 func Open(name string) (file *File ...
- C语言文件操作
C语言文件操作,以下以基本的例子和说明来展开怎么通过C语言来进行文件操作. 操作文件,我们得需要知道什么?当然是路径和文件名. 首先我需要知道我操作的文件在哪里,叫什么名字.在C语言中还存在一个打开方 ...
- C 语言文件操作
C 语言文件操作 1. 数据流: 程序与数据的交互以流的形式进行.fopen 即打开数据流,fclose 即刷新数据流. 所谓数据流,是一种抽象,表示这段数据像流一样,需要逐步接收,不 ...
- C语言文件操作函数
C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * str ...
- C语言文件操作解析(五)之EOF解析(转载)
C语言文件操作解析(五)之EOF解析 在C语言中,有个符号大家都应该很熟悉,那就是EOF(End of File),即文件结束符.但是很多时候对这个理解并不是很清楚,导致在写代码的时候经常出错,特 ...
- 【转】C语言文件操作解析(三)
原文网址:http://www.cnblogs.com/dolphin0520/archive/2011/10/07/2200454.html C语言文件操作解析(三) 在前面已经讨论了文件打开操作, ...
- C语言文件操作函数大全(超详细)
C语言文件操作函数大全(超详细) 作者: 字体:[增加 减小] 类型:转载 本篇文章是对C语言中的文件操作函数进行了详细的总结分析,需要的朋友参考下 fopen(打开文件)相关函数 open,fc ...
- C语言文件操作 FILE结构体
内存中的数据都是暂时的,当程序结束时,它们都将丢失.为了永久性的保存大量的数据,C语言提供了对文件的操作. 1.文件和流 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特 ...
- C语言文件操作相关函数
在实际应用中,我们往往需要对文件进行操作,下面我将介绍C语言的一些关于操作文件的函数. 一.计算机文件 计算机文件是以计算机硬盘为载体存储在计算机上的信息集合,是存储在某种长期储存设备上的一段数据流. ...
- 关于C语言文件操作
关于C语言的文件操作之前我也写过一篇博客来介绍,但是当时写的很不全面,只是简单的使用了一下 ,今天再从新学习一下. 1.文件的写 首先还是先看一个简单的例子: include<stdio.h&g ...
随机推荐
- [LeetCode] Letter Case Permutation 字母大小写全排列
Given a string S, we can transform every letter individually to be lowercase or uppercase to create ...
- requestAnimationFrame移动端实现回到顶部效果
$('#backToTop').click(function(){ var dist = $(document).height() - $(window).height(); timer = requ ...
- div+css显示两行或三行文字,超出用...表示
<style> .comment_inner{ width: 200px; word-break: break-all; text-overflow: ellipsis; display: ...
- servlet实现简单的登录功能
1.登录页面 Login.html <%@page contentType="text/html" pageEncoding="UTF-8"%> & ...
- Web开发——Photoshop(PSD格式截取)
Step1 将截取到的图片,存储为Web所用格式. Step2 在右上角选择存储格式为:PNG-24(PNG-8可能会出现白边).
- 常用数据类型的方法--str、int、list、dict
一.字符串类型(str) class str(basestring): """ str(object='') -> string Return a nice str ...
- PL_SQL学习
打印输出: dbms_output.put_line('AA'); 显示服务器输出信息 set serveroutput on; 打印出eid=1的员工姓名: declare v_name varc ...
- Redis 开发规范
本文主要介绍在使用阿里云Redis的开发规范,从下面几个方面进行说明. 键值设计 命令使用 客户端使用 相关工具 通过本文的介绍可以减少使用Redis过程带来的问题. 一.键值设计 1.key名设计 ...
- SpringMVC中映射路径的用法之请求限制、命名空间
SpringMVC中映射路径的请求限制 什么是SpringMVC请求限制? 在SpringMVC中,支持对请求的设置.如果不满足限制条件的话,就不让请求访问执行方法,这样可以大大提高执行方法 的安全性 ...
- windows下安装php reids扩展
1.使用phpinfo()函数查看PHP的版本信息,这会决定扩展文件版本. 2.下载php_igbinary-1.2.1-5.5-ts-vc11-x64.zip,php_redis-2.2.5-5.6 ...