写点什么

【愚公系列】2022 年 11 月 Go 教学课程 039- 文件操作

作者:愚公搬代码
  • 2022-11-02
    福建
  • 本文字数:2703 字

    阅读完需:约 9 分钟

前言

文件的操作在计算机是必不可少的,比如 word、excel、ppt,txt 等等在日常办公中都是很常用的。文件的操作主要包含:创建文件、打开文件、读取文件、写入文件、关闭文件、打包/解包、压缩/解压缩、改变文件权限、删除文件、移动文件、重命名文件等。


Go 语言官方库:os、io/ioutil、bufio 涵盖了文件操作的所有场景。os 提供了对文件 IO 直接调用的方法,bufio 提供缓冲区操作文件的方法,io/ioutil 也提供对文件 IO 直接调用的方法。

一、文件操作

1.文件的基础操作

package main
import ( "log" "os")
func main() { // 创建文件 f, err := os.Create("test.txt") if err != nil { log.Fatalf("create file failed err=%s\n", err) } // 获取文件信息 fileInfo, err := f.Stat() if err != nil { log.Fatalf("get file info failed err=%s\n", err) }
log.Printf("File Name is %s\n", fileInfo.Name()) log.Printf("File Permissions is %s\n", fileInfo.Mode()) log.Printf("File ModTime is %s\n", fileInfo.ModTime())
// liunx改变文件权限 //err = f.Chmod(0777) //if err != nil { // log.Fatalf("chmod file failed err=%s\n", err) //}
// 改变拥有者 //err = f.Chown(os.Getuid(), os.Getgid()) //if err != nil { // log.Fatalf("chown file failed err=%s\n", err) //}
// 再次获取文件信息 验证改变是否正确 fileInfo, err = f.Stat() if err != nil { log.Fatalf("get file info second failed err=%s\n", err) } log.Printf("File change Permissions is %s\n", fileInfo.Mode())
// 关闭文件 err = f.Close() if err != nil { log.Fatalf("close file failed err=%s\n", err) }
// 删除文件 err = os.Remove("test.txt") if err != nil { log.Fatalf("remove file failed err=%s\n", err) }}
复制代码


2.文件的写入的三种方式

2.1 WriteString

package main
import ( "fmt" "os")
func main() { file, err := os.Create("b.txt") if err != nil { fmt.Println(err) } defer file.Close() // 写入数据 n, err := file.WriteString("Hello World") if err != nil { fmt.Println(err) } fmt.Println(n)}
复制代码


2.2 Write

package main
import ( "fmt" "os")
func main() { file, err := os.Create("c.txt") if err != nil { fmt.Println(err) } defer file.Close() var str string = "Hello World" n, err := file.Write([]byte(str)) // 需要将字符串转成字节切片 if err != nil { fmt.Println(err) } fmt.Println(n) //file.WriteString()}
复制代码


2.3 WriteAt

package main
import ( "fmt" "io" "os")
func main() { file, err := os.Create("d.txt") if err != nil { fmt.Println(err) } defer file.Close() file.WriteString("Hello World") var str string = "aaa" num, _ := file.Seek(10, io.SeekEnd) // 将光标定位到文件中原有内容的后面,返回文件中原有数据的长度 fmt.Println("num=", num) n, err := file.WriteAt([]byte(str), num) // 第二个参数:表示在指定位置写入数据。 if err != nil { fmt.Println(err) } fmt.Println(n)
}
复制代码


3.文件的打开

OpenFile( )这个函数有三个参数:


  • 第一个参数表示:打开文件的路径

  • 第二个参数表示:模式,常见的模式有 O_RDONLY(只读模式),O_WRONLY(只写模式), O_RDWR(可读可写模式),O_APPEND(追加模式)。

  • 第三个参数表示: 权限,取值范围(0-7)

  • 表示如下:

  • 0:没有任何权限

  • 1:执行权限(如果是可执行文件,是可以运行的)

  • 2:写权限

  • 3: 写权限与执行权限

  • 4:读权限

  • 5: 读权限与执行权限

  • 6: 读权限与写权限

  • 7: 读权限,写权限,执行权限


package main
import ( "os" "fmt")
//OpenFile()这个函数有三个参数://第一个参数表示:打开文件的路径//第二个参数表示:模式,常见的模式有//O_RDONLY(只读模式),O_WRONLY(只写模式), O_RDWR( 可读可写模式),O_APPEND(追加模式)。////第三个参数表示: 权限,取值范围(0-7)//表示如下://0:没有任何权限//1:执行权限(如果是可执行文件,是可以运行的)//2: 写权限//3: 写权限与执行权限//4: 读权限//5: 读权限与执行权限//6: 读权限与写权限//7: 读权限,写权限,执行权限func main() { file, err := os.OpenFile("c:/Test/c.txt", os.O_APPEND, 6) if err != nil { fmt.Println(err) } defer file.Close() // 通过文件指针向文件中写入数据,读取数据 n, err := file.WriteString("愚公搬代码") if err != nil { fmt.Println(err) } fmt.Println(n)
}
复制代码


4.文件的读取

package main
import ( "fmt" "os")
func main() { // 1: 打开要读取的文件 file, err := os.Open("c.txt") // 注意:OpenFile方法的区别 if err != nil { fmt.Println(err) } defer file.Close() // 2: 进行文件内容读取 // 定义一个字符类型切片,存储从文件中读取的数据 buffer := make([]byte, 1024*2) // 大小为2kb n, err := file.Read(buffer) // 将从文件中读取的数据保存到字符切片中, n:表示从文件中读取的数据的长度 if err != nil { fmt.Println(err) } fmt.Println(string(buffer[:n])) fmt.Println("读取数据的长度:", n) // 3: 关闭文件}
复制代码



package main
import ( "fmt" "io" "os")
func main() { file, err := os.Open("c.txt") if err != nil { fmt.Println(err) } defer file.Close() buffer := make([]byte, 10) for { n, err := file.Read(buffer) if err == io.EOF { // 表示达到文件末尾了。 break }
fmt.Print(string(buffer[:n])) }
}
复制代码


5.案例

package main
import ( "os" "fmt" "io")
//文件拷贝,将已有的文件复制一份,同时重新命名。func main() { // 1: 打开原有文件(file.txt) file1,err:=os.Open("c.txt") if err!=nil{ fmt.Println(err) } // 2: 创建一个新的文件 file2,err:=os.Create("file2.txt") if err!=nil{ fmt.Println(err) } defer file1.Close() defer file2.Close() // 3: 将原有文件中的内容读取出来,然后写入到新的文件中。 buffer:=make([]byte,1024*2) for { n,err:=file1.Read(buffer) if err==io.EOF { break } file2.Write(buffer[:n]) }
// 4: 关闭文件}
复制代码



发布于: 刚刚阅读数: 4
用户头像

还未添加个人签名 2022-03-01 加入

该博客包括:.NET、Java、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、python、大数据等相关使用及进阶知识。查看博客过程中,如有任何问题,皆可随时沟通。

评论

发布
暂无评论
【愚公系列】2022年11月 Go教学课程 039-文件操作_11月月更_愚公搬代码_InfoQ写作社区