文章目录
- 前言
- 一、文件操作
- 1.文件的基础操作
- 2.文件的写入的三种方式
- 2.1 WriteString
- 2.2 Write
- 2.3 WriteAt
- 3.文件的打开
- 4.文件的读取
- 5.案例
前言
文件的操作在计算机是必不可少的,比如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: 关闭文件
}