Appearance
第 17 章:文件操作
17.1 读取文件
读取整个文件
使用 os.ReadFile 函数可以一次性读取整个文件的内容:
go
package main
import (
"fmt"
"os"
)
func main() {
data, err := os.ReadFile("example.txt")
if err != nil {
fmt.Println("Error reading file:", err)
return
}
fmt.Println(string(data))
}逐行读取文件
使用 bufio 包可以逐行读取文件:
go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.Open("example.txt")
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
fmt.Println("Error scanning file:", err)
}
}17.2 写入文件
写入整个文件
使用 os.WriteFile 函数可以一次性写入整个文件:
go
package main
import (
"fmt"
"os"
)
func main() {
data := []byte("Hello, World!\nThis is a test file.")
err := os.WriteFile("output.txt", data, 0644)
if err != nil {
fmt.Println("Error writing file:", err)
return
}
fmt.Println("File written successfully")
}追加写入文件
使用 os.OpenFile 函数可以以追加模式打开文件:
go
package main
import (
"fmt"
"os"
)
func main() {
file, err := os.OpenFile("output.txt", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
data := []byte("\nThis is an appended line.")
_, err = file.Write(data)
if err != nil {
fmt.Println("Error writing file:", err)
return
}
fmt.Println("File appended successfully")
}17.3 复制、删除、遍历文件
复制文件
使用 io.Copy 函数可以复制文件:
go
package main
import (
"fmt"
"io"
"os"
)
func copyFile(src, dst string) error {
source, err := os.Open(src)
if err != nil {
return err
}
defer source.Close()
destination, err := os.Create(dst)
if err != nil {
return err
}
defer destination.Close()
_, err = io.Copy(destination, source)
return err
}
func main() {
err := copyFile("source.txt", "destination.txt")
if err != nil {
fmt.Println("Error copying file:", err)
return
}
fmt.Println("File copied successfully")
}删除文件
使用 os.Remove 函数可以删除文件:
go
package main
import (
"fmt"
"os"
)
func main() {
err := os.Remove("file.txt")
if err != nil {
fmt.Println("Error deleting file:", err)
return
}
fmt.Println("File deleted successfully")
}遍历目录
使用 os.ReadDir 函数可以遍历目录:
go
package main
import (
"fmt"
"os"
)
func main() {
entries, err := os.ReadDir(".")
if err != nil {
fmt.Println("Error reading directory:", err)
return
}
for _, entry := range entries {
if entry.IsDir() {
fmt.Printf("%s/ (directory)\n", entry.Name())
} else {
fmt.Printf("%s (file)\n", entry.Name())
}
}
}17.4 JSON 序列化与反序列化
JSON 序列化
使用 encoding/json 包可以将结构体序列化为 JSON:
go
package main
import (
"encoding/json"
"fmt"
"os"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
City string `json:"city"`
}
func main() {
person := Person{
Name: "Alice",
Age: 25,
City: "Beijing",
}
data, err := json.MarshalIndent(person, "", " ")
if err != nil {
fmt.Println("Error marshaling JSON:", err)
return
}
err = os.WriteFile("person.json", data, 0644)
if err != nil {
fmt.Println("Error writing file:", err)
return
}
fmt.Println("JSON written successfully")
}JSON 反序列化
使用 encoding/json 包可以将 JSON 反序列化为结构体:
go
package main
import (
"encoding/json"
"fmt"
"os"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
City string `json:"city"`
}
func main() {
data, err := os.ReadFile("person.json")
if err != nil {
fmt.Println("Error reading file:", err)
return
}
var person Person
err = json.Unmarshal(data, &person)
if err != nil {
fmt.Println("Error unmarshaling JSON:", err)
return
}
fmt.Printf("Name: %s\nAge: %d\nCity: %s\n", person.Name, person.Age, person.City)
}