i:input 读
o:output 写
01010101 流
获取文件信息
计算机中的文件是存储在外部介质(通常是磁盘)上的数据集合,文件分为文本文件和二进制文件。file类是在os包中的,封装了底层的文件描述符和相关信息,同时封装了Read和Write的实现。
Fileinfo接口定义了file信息相关的方法
package main
import (
"fmt"
"os"
)
func main() {
fileinfo, error := os.Stat("D:\\Environment\\GoWorks\\src\\awesomeProject\\lesson10\\a.txt") //"./a.txt"在控制台运行出错的,在terminal中运行
if error != nil {
fmt.Println(error)
return
}
fmt.Println(fileinfo.Name()) //文件的名称
fmt.Println(fileinfo.IsDir()) //是否是一个文件
fmt.Println(fileinfo.Size()) //文件大小、字节
fmt.Println(fileinfo.Mode()) //文件读写属性
fmt.Println(fileinfo.ModTime()) //文件的修改时间
// 反射获取文件更加详细的信息
fmt.Println(fileinfo.Sys())
}
/*
a.txt
false
10
-rw-rw-rw-
2022-12-30 10:05:41.5050535 +0800 CST
&{32 {554152117 31005683} {2890671406 31005693} {939907367 31005683} 0 10}
*/
科普:权限
linux下有两种文件权限表示方式,符号和八进制表示
符号表示:
- --- --- ---
type owner group others
type:文件类型 - 文件 d 目录|连接符号
---,代表的文件读写可执行 字母 r w x,如果额米有那个权限就用 - 代替
八进制表示
r 004
w 003
x 001
- 000
比如 777 就是可读可写可执行
创建目录与文件
package main
import (
"fmt"
"os"
)
func main() {
err := os.Mkdir("D:\\Environment\\GoWorks\\src\\awesomeProject\\lesson10\\test", os.ModePerm)
if err != nil {
fmt.Println(err)
//return
}
fmt.Println("文件创建成功")
//MkdirAll 创建层级目录
err2 := os.MkdirAll("D:\\Environment\\GoWorks\\src\\awesomeProject\\lesson10\\test1\\a1\\b1\\c1", os.ModePerm)
if err2 != nil {
fmt.Println(err2)
}
// Remove删除目录,如果目录下有文件则会删除不了
//RemoveAll删除目录下所有的文件
err3 := os.RemoveAll("D:\\Environment\\GoWorks\\src\\awesomeProject\\lesson10\\test1")
if err3 != nil {
fmt.Println(err3)
}
return
}
创建文件
package main
import (
"os"
)
func main() {
//_, erro := os.Create("lesson10/d.txt")
//if erro != nil {
// fmt.Println(erro)
//}
//return
//fmt.Println(f1.Name())
//删除文件
os.Remove("D:\\Environment\\GoWorks\\src\\awesomeProject\\lesson10\\d.txt")
}
I/0读
打开文件
读取a.txt文件中的数据
package main
import (
"fmt"
"os"
)
func main() {
//一、查看文件权限
fileinfo, error := os.Stat("lesson10/a.txt")
if error != nil {
fmt.Println(error)
return
}
fmt.Println(fileinfo.Mode()) //查看权限 -rw-rw-rw-
//1、打开文件,建立连接open
o1, erro := os.Open("lesson10/a.txt")
if erro != nil {
fmt.Println(erro)
return //如果程序出错,需要返回信息
}
fmt.Println(o1.Name())
// 2、关闭连接
defer o1.Close()
//读取a.txt信息
//传入需要一个切片
bs := make([]byte, 1, 1024)
n, err := o1.Read(bs)
fmt.Println(n) //读取到个数 一次可以读取到1个信息
fmt.Println(string(bs))
fmt.Println(err)
n, err = o1.Read(bs) //再次向下读取 如果不赋值这里将只能读取第一个字符
fmt.Println(n) //多次赋值执行,可以继续往下读取信息
fmt.Println(string(bs))
fmt.Println(err)
////二、上面一种我们不知道文件的权限
////1、OpenFile对文件进行指定的连接
//o2, erro := os.OpenFile("lesson10/a.txt", os.O_RDONLY|os.O_WRONLY, os.ModePerm) //os.O_RDONLY|os.O_WRONLY:可读|可写
//if erro != nil {
// fmt.Println(erro)
// return //如果程序出错,需要返回信息
//}
//fmt.Println(o2.Name())
//// 2、关闭连接
//defer o1.Close()
}
I/O写
package main
import (
"fmt"
"os"
)
func main() {
//打开文件,建立连接
file, err := os.OpenFile("lesson10/a.txt", os.O_RDONLY|os.O_WRONLY|os.O_APPEND, os.ModePerm)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(file.Name())
defer file.Close()
// 向文件里面写入信息
bs := []byte{65, 66, 67} //write传入参数也是一个byte切片
n, err := file.Write(bs)
fmt.Println(n) //追加的字符个数
// 字符串输入
n, err = file.WriteString("xuexiangban,狂神说")
fmt.Println(n)
}
文件复制
package main
import (
"fmt"
"io"
"os"
)
func main() {
soure := "D:\\Environment\\GoWorks\\src\\awesomeProject\\lesson10\\img\\12_28.jpg"
destination := "D:\\Environment\\GoWorks\\src\\awesomeProject\\lesson10\\img_copy\\12_28_03.jpg"
//copy(destination,soure, 1024)
//copy2(destination, soure)
copy3(destination, soure)
}
// 3、os.ReadFile方法
// 它是一次性读取文件一次性写出,不适合较大的文件,文件如果较大容易造成内存溢出
func copy3(destination, soure string) {
filebuf, _ := os.ReadFile(soure)
os.WriteFile(destination, filebuf, 0777)
}
// 2、系统的copy方法
func copy2(destination, soure string) {
//输入文件
sourefile, err := os.Open(soure)
if err != nil {
fmt.Println(err)
return
}
defer sourefile.Close()
// 输出文件
destinationfile, err := os.OpenFile(destination, os.O_WRONLY|os.O_CREATE, os.ModePerm) //O_WRONLY可读可写的合并,O_CREATE没有文件则自动创建
if err != nil {
fmt.Println(err)
return
}
defer destinationfile.Close()
written, error := io.Copy(destinationfile, sourefile)
if error != nil {
fmt.Println(error)
}
fmt.Println("文件大小:", written)
}
// 1、定义一个copy方法:目标文件,初始文件 ,缓存字节的大小
func copy(destination, soure string, bufsize int) {
//输入文件
sourefile, err := os.Open(soure)
if err != nil {
fmt.Println(err)
return
}
defer sourefile.Close()
// 输出文件
destinationfile, err := os.OpenFile(destination, os.O_WRONLY|os.O_CREATE, os.ModePerm) //O_WRONLY可读可写的合并,O_CREATE没有文件则自动创建
if err != nil {
fmt.Println(err)
return
}
defer destinationfile.Close()
// 缓冲区
buf := make([]byte, bufsize)
//读取
for {
n, err := sourefile.Read(buf) //读取一次 1024字节远远不够,可以通过for循环读取完毕
if err == io.EOF || n == 0 {
fmt.Println("复制完毕")
break
}
_, err = destinationfile.Write(buf[:n]) //buf[:n]从0开始读取完毕
if err != nil {
fmt.Println("写入失败", err)
}
}
}
Seeker接口
Seeker是包装Seek方法的接口
type Seeker interface{
Seek(offset int 64,whence int)(int64,error)
}
Seek(offset,whence),设置指针光标的位置,读写文件:
第一个参数:偏移量
第二个参数:如何设置
0:seekStart 表示相对于文件开头
1:seekCurrent 表示相对于当前光标所在位置来说的
2:seekend 表示相对于文件末尾
package main
import (
"fmt"
"io"
"os"
)
func main() {
file, _ := os.OpenFile("D:\\Environment\\GoWorks\\src\\awesomeProject\\lesson10\\a.txt", os.O_RDWR, os.ModePerm)
defer file.Close()
// 业务
file.Seek(3, io.SeekStart) //从开头执行,移三位
buf := []byte{0}
file.Read(buf) //buf需要切片传入
fmt.Println(string(buf))
file.Seek(3, io.SeekCurrent) //从光标当前位置
file.Read(buf) //buf需要切片传入
fmt.Println(string(buf))
file.Seek(0, io.SeekEnd) //从光标当前位置,不再向后移
file.WriteString("kaibai")
}
标签:文件,语言,err,fmt,Println,file,Go,狂神,os
From: https://www.cnblogs.com/DuPengBG/p/17015918.html