golang中文件的处理

7 篇文章 0 订阅
13 篇文章 0 订阅

文件相关的操作均在 os 包里,每次对文件进行操作需要导入 os包
1 .最基本的就是文件的创建,,需要Create函数,该函数返回两个值,一个事文件的指针,还有一个是error类
(同时我们记住每次文件调用完毕需要使用Close()函数将其关闭,避免占用系统资源)

2 .文件写入
我们可以使用
①指针.WriteString(“内容”),返回两个值,一个长度,一个错误类型

②Write(b []byte )
③WriteAt(b []byte, on int) ,需要配合 指针.Seek(0,io.SeekEnd) // 将光标定位到文件的内容的最后面,0代表光标在此基础上移动几位

package main

import (
	"fmt"
	"os"
)

func main(){
	file,err:=os.Create("d:/a.txt")
	if  err!=nil{
		fmt.Println(err)
		file.Close()
	}
	//对创建的文件进行相关操作
	var str string = "Hello yayue"
	n ,err1:= file.Write([]byte(str ))
	if err1!= nil{
		fmt.Println(err1)
	}
	var str1 string = "aaa"

	num,_ :=file.Seek(0,io.SeekEnd)//将光标定位到文件的内容的最后面,0代表光标在此基础上移动几位
	file.WriteAt([]byte(str1),num)
	fmt.Println(n)
	//关闭文件
	defer file.Close()
}

按位置写:
Seek() 修改文件的读写指针位置
参数1:偏移量。 正:向文件尾偏, 负:向文件头偏
参数2:偏移起始位置:
io.SeekStart: 文件起始位置
io.SeekCurrent:文件当前位置
io.SeekEnd: 文件结尾位置
返回值:表示文件从起始位置,到当前文件读写指针位置的偏移量

按字节写: writeAt() 在文件指定偏移位置,写入[]byte,通常搭配Seek()
参1:待写入参数
参2:偏移量
返回:实际写出的字节数
n,_ = f.WriteAt([]byte(’‘3231fds’’),off)

3.打开文件 使用 os.OpenFile(),该函数有3个参数
第一个参数表示 :打开文件的路径。
第二个参数表示 :模式,有os.O_APPEND(追加模式)、os.O_RDONLY(只读模式)、os.O_WRONLY(只写模式)、os.O_RDWR(可读可写模式)。
第三个参数表示 :权限 (0-7)
0:没有任何权限
1:执行权限
2:写权限
3:写权限和执行权限
4:读权限
5:读权限和执行权限
6:读权限和写权限
7:都权限,写权限和执行权限

如果使用file.Open(),则相当于只读打开OpenFile()
文件可以用 filePoint.Read()来读取文件
buffer := make([]byte, 1024) //大小为1kb
num,err := file.Read(buffer)

当我们一个切片变量无法存储全部的文件内容时
当然我们可以循环读取文件内容并输出:

buffer := make([]byte,5)
//num1,err :=file.Read(buffer)//读取到buffer
for  {
	numN ,err := file.Read(buffer)
	if err == io.EOF{  // 表示到达末尾了
		break
	}
	fmt.Println(string(buffer[:numN]))
}

4.读文件
按行读:
1.创建一个带有缓冲区的Reader(读写器)
reader:= bufio.NewReader(文件指针) //获取一个Reader类型 ,自带缓冲区
2.从reader的缓冲区中,读取指定长度的数据。数据长度取决于参数dlime。
buf ,err :=reader.ReadBytes(’\n’) //按行读 ,从Reader的缓冲区中读取。
判断到达文件结尾:if err!=nil && err == io.EOF 到文件结尾。
文件结束标记是需要单独 读一次获取到的

	reader:= bufio.NewReader(f)
	for{
		buf,err:=reader.ReadBytes('\n')  // 读一行数据,直到换行位置(读一行)
		if   err == io.EOF{
			fmt.Println("文件读取完毕")
			return
		}else if err!=nil{
			fmt.Println(              "ReadBytes err:",err)
			return
		}
		fmt.Println( string(buf))

按字节都文件写文件 :
n,err := read([]byte) //按照字节读文件 n为成功读入的内容
n,err := write([]byte) //按照字节写文件

5.目录操作:
打开目录 :OpenFile(1,2,3) //和上面打开文件类似
参1:name
参2:打开文件权限:O_RDONLY、O_WRONLY、O_RDWR
参3:os.ModeDir
返回值:返回一个可以读写目录的文件指针

读目录:(f *File) Readdir(n int) ([]FileInfo ,error)
参1:表示读取目录的成员个数,通常传-1,表示目录中所有文件对象
返回值: FileInfo类型的切片。内部保存了文件名,error中保存错误信息

type FileInfo interface {
   Name() string       // base name of the file
   Size() int64        // length in bytes for regular files; system-dependent for others
   Mode() FileMode     // file mode bits
   ModTime() time.Time // modification time
   IsDir() bool        // abbreviation for Mode().IsDir()
   Sys() interface{}   // underlying data source (can return nil)
}

得到 FileInfo类型切片后,我们可以range遍历切片元素,使用.Name()获取文件名。使用.Size()获取文件大小,使用.IsDir()判断文件是目录还是非目录文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

赤狐先生

如果有一点点帮助,可以给点支持

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值