文件是什么?
计算机中的文件是存储在外部介质(通常是磁盘)上的数据集合,文件分为文本文件和二进制文件。
打开文件
func Open(name string) (*File, error)
func main() {
// 打开文件
file, err := os.Open("./panghu.txt")
if err != nil {
fmt.Printf("open file failed err: %v \n", err)
return
}
// 关闭文件
defer file.Close()
}
写入内容
打开文件
func OpenFile(name string, flag int, perm FileMode) (*File, error)
os.O_RDONLY //只读
os.O_WRONLY //只写
os.O_RDWR //读写文件
os.O_APPEND //追加文件
os.O_CREATE //不存在时创建文件
os.O_TRUNC //打开时截断文件
func main() {
file, err := os.OpenFile("./panghu.txt", os.O_CREATE | os.O_APPEND | os.O_RDWR, 0666)
if err != nil {
fmt.Printf("open file failed err: %v \n", err)
return
}
// 延迟关闭
defer file.Close()
n, err2 := file.WriteString("ok panghu!")
if err2 != nil {
fmt.Printf("WriteString failed err: %v \n", err)
return
}
fmt.Println(n)
}
读取文件
func Read(fd Handle, p []byte) (n int, err error)
func main() {
file, err := os.OpenFile("./panghu.txt", os.O_CREATE | os.O_APPEND | os.O_RDWR, 0666)
if err != nil {
fmt.Printf("open file failed err: %v \n", err)
return
}
defer file.Close()
var tmp = make([]byte, 128)
n, err2 := file.Read(tmp) // n读取了多少字节
if err2 != nil {
fmt.Printf("read file failed err: %v \n", err)
return
}
fmt.Println(n, string(tmp[:n]))
}
读取文件全部数据
使用for循环读取
func main() {
file, err := os.Open("./panghu.txt")
if err != nil {
fmt.Printf("open file failed err: %v \n", err)
return
}
defer file.Close()
var tmp = make([]byte, 128)
var context []byte
for {
n, err := file.Read(tmp)
if err == io.EOF {
fmt.Println("文件读取完毕!")
break
}
if err != nil {
fmt.Printf("Read file failed err: %v \n", err)
return
}
fmt.Println(n)
context = append(context, tmp[:n]...) // ... 拆开放入
}
fmt.Println(string(context[:]))
}
bufio
按行读取内容 有缓冲
func main() {
file, err := os.Open("./panghu.txt")
if err != nil {
fmt.Printf("open file failed err: %v \n", err)
return
}
defer file.Close()
reader := bufio.NewReader(file)
for {
line, err2 := reader.ReadString('\n')
if err2 == io.EOF {
fmt.Println("已读取完毕")
break
}
if err2 != nil {
fmt.Printf("readerString file err: %v", err)
return
}
fmt.Println(line)
}
}
ioutil
读取文件全部内容
func main() {
txt, err := ioutil.ReadFile("./panghu.txt")
if err != nil {
fmt.Println("读取错误: ", err)
return
}
fmt.Println(string(txt))
}
文件写入
Write、WriteString
func main() {
file, err := os.OpenFile("./a.txt", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666)
if err != nil {
fmt.Printf("open file failed err: ", err)
return
}
file.Write([]byte("hello \n"))
file.WriteString("hello world \n")
}
bufio.NewWriter
func main() {
file, err := os.OpenFile("xx.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
if err != nil {
fmt.Println("open file failed, err:", err)
return
}
defer file.Close()
writer := bufio.NewWriter(file)
for i := 0; i < 10; i++ {
writer.WriteString("hello\n") //将数据先写入缓存
}
writer.Flush() //将缓存中的内容写入文件
}
ioutil.WriteFile
func main() {
str := "hello"
err := ioutil.WriteFile("./xx.txt", []byte(str), 0666)
if err != nil {
fmt.Println("write file failed, err:", err)
return
}
}
检测文件是否存在
func main() {
fileInfo, err := os.Stat("./a.txt")
if err != nil {
if os.IsNotExist(err) {
// 文件不存在
log.Fatal("File does not exist.")
}
fmt.Println("err: ", err)
return
}
// 文件大小
fmt.Println(fileInfo.Size())
// 文件名称
fmt.Println(fileInfo.Name())
// 修改时间
fmt.Println(fileInfo.ModTime())
}
修改文件权限、改变时间戳
func main() {
err := os.Chmod("./a.txt", 777)
if err != nil {
fmt.Println(err)
}
//改变时间戳
twoDaysFromNow := time.Now().Add(48 * time.Hour)
lastAccessTime := twoDaysFromNow
lastModifyTime := twoDaysFromNow
err = os.Chtimes("./a.txt", lastAccessTime, lastModifyTime)
if err != nil {
log.Println(err)
}
}
移除文件
func main() {
err := os.Remove("a.txt")
if err != nil {
fmt.Println(err)
}
}