文件相关的操作均在 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()判断文件是目录还是非目录文件。