在计算机中的一切都是以二进制流的方式存在的,Go语言进行I/O操作的时候是以文件的的指针
*file
进行操作的。I/O操作我需要使用到os
这个内置包。
1、读取文件信息:Read
2、向文件中写入数据:Write
3、读取文件信息:FileInfo
package main
import (
"fmt"
"log"
"os"
)
func main() {
fileinfo, err := os.Stat("文件路径")
if err != nil {
log.Println("获取文件信息失败")
}
fmt.Println(fileinfo.Name()) // 获取文件名称
fmt.Println(fileinfo.Size()) // 获取文件大小
fmt.Println(fileinfo.Mode()) // 获取文件权限
fmt.Println(fileinfo.IsDir()) // 判断是否文件夹
}
创建目录
mkdir / 权限
mkdirAll 创建层级目录
remove 删除目录
removeAll 强制删除目录
package main
import (
"fmt"
"log"
"os"
)
func main() {
// 绝对路径创建文件夹,会返回一个err
err := os.Mkdir("C:\\Users\\123\\Desktop\\test", os.ModePerm)
if err != nil {
log.Println("文件夹创建失败")
}
fmt.Println("文件夹创建成功")
// 绝对路径创建层级文件夹
err = os.MkdirAll("C:\\Users\\123\\Desktop\\test\\test1\\test2\\test3", os.ModePerm)
if err != nil {
log.Println("文件夹创建失败")
}
fmt.Println("文件夹创建成功")
// 删除单层文件夹
err = os.Remove("C:\\Users\\123\\Desktop\\test\\test1")
if err != nil {
fmt.Println(err)
//return
}
fmt.Println("file delete success!!")
// 如果存在多层文件,removeAll,相对来说比较危险,删除这个目录下的所有东西, 强制删除
err = os.RemoveAll("C:\\Users\\123\\Desktop\\test\\test1")
if err != nil {
fmt.Println(err)
return
}
fmt.Println("file delete success!!")
}
创建文件
os.create(),若存在就是打开-返回的这个file对象. 如果不存在,创建在打开
package main
import (
"fmt"
"os"
)
func main() {
// 创建文件 Create
// func Create(name string) (*File, error) {
// 返回的file对象就是我们的文件
file, err := os.Create("aaa.go") // 相对路径
// 我们习惯于在建立连接时候通过defer来关闭连接,保证程序不会出任何问题,或者忘记关闭
defer file.Close()
if err != nil {
fmt.Println(err)
}
fmt.Println(file)
}
IO动作介绍
-
O_RDONLY
: 以只读方式打开文件。文件指针可定位于文件的任意位置。当尝试写入时,会返回错误。 -
O_WRONLY
: 以只写方式打开文件。即使文件已存在,它也会被截断为零长度,除非同时使用了O_APPEND
标志。文件指针总是在文件的开始位置。 -
O_RDWR
: 以读写方式打开文件。文件指针可定位于文件的任意位置。同时具有读写能力。
除了这三个主要的模式,还有其他几个常量可以与它们组合使用,以修改文件打开的行为:
-
O_APPEND
: 设置文件指针于文件末尾。所有写入操作都会在文件末尾添加数据,而不是覆盖现有内容。 -
O_CREATE
: 如果文件不存在,则创建一个新文件。与O_TRUNC
结合使用时,可以创建一个新文件或截断(清空)一个已存在的文件。 -
O_EXCL
: 与O_CREATE
一起使用时,确保文件不存在。如果文件已存在,打开操作将失败。 -
O_SYNC
: 开启文件的同步 I/O 模式,即每次写入操作都将导致物理磁盘操作,以确保数据确实写入磁盘。 -
O_TRUNC
: 如果文件存在且为打开用于写入,则截断文件至零长度。
IO读
1、IO读可以使用os.open()和os.openfile(),其中os.openfile可以设置文件读写的权限
package main
import (
"fmt"
"os"
)
// IO读
func main() {
// 我们习惯于在建立连接时候通过defer来关闭连接,保证程序不会出任何问题,或者忘记关闭
defer file1.Close()
defer file2.Close()
// func Open(name string) (*File, error)
file1, err := os.Open("aaa.txt") //在相对路径找
if err != nil {
fmt.Println(err)
}
fmt.Println(file1)
// file 类-- 指定的对象
// 打开文件的时候,选定权限:可读可写的方式打开
// OpenFile(文件名,打开方式:可读、可写...,FileMode , 权限)
file2, err2 := os.OpenFile("aaa.txt",os.O_RDWR, os.ModePerm)
if err2 != nil {
fmt.Println(err2)
}
fmt.Println(file2)
}
2、读取 file.Read([]byte) ,将file中的数据读取到 []byte 中, n,err n读取到的行数,err 错误,EOF错误,就代表文件读取完毕了
package main
import (
"fmt"
"os"
)
// 读取文件数据
func main() {
// 建立连接
file, _ := os.Open("a