» Go语言快速入门 » 2. 进阶篇 » 2.5 文件处理

文件处理

在 Go 中,ioutil 包实现了一些 I/O 相关函数。 但是,从 Go 1.16 开始,相关功能都由 io 包或 os 包提供。新代码中应该优先使用这些实现。

读取文件

package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	// 打开文件
	file, err := os.Open("example.txt")
	if err != nil {
		fmt.Println("Error opening file:", err)
		return
	}
	defer file.Close()

	// 读取文件的全部内容
	content, err := io.ReadAll(file)
	if err != nil {
		fmt.Println("Error reading file:", err)
		return
	}

	fmt.Println("File Content:")
	fmt.Println(string(content))
}

按行读取文件

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() {
		line := scanner.Text()
		fmt.Println("Line:", line)
	}

	if err := scanner.Err(); err != nil {
		fmt.Println("Error reading file:", err)
	}
}

写入文件

package main

import (
	"fmt"
	"os"
)

func main() {
	content := []byte("Hello, Golang!")

	// 创建或打开要写入的文件
	file, err := os.Create("example.txt")
	if err != nil {
		fmt.Println("Error creating file:", err)
		return
	}
	defer file.Close()

	// 将内容写入文件
	_, err = file.Write(content)
	if err != nil {
		fmt.Println("Error writing to file:", err)
		return
	}

	fmt.Println("File written successfully!")
}

文件路径

path/filepath 包提供了以跨平台的方式处理文件路径的功能。

拼接路径元素

filepath.Join 函数用于将文件路径的各个元素拼接成一个单一的路径。

package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	// 拼接路径元素
	path := filepath.Join("dir", "subdir", "file.txt")
	fmt.Println("Joined path:", path)
}

获取路径的文件基本名和目录

filepath.Base 函数返回路径的最后一个元素,filepath.Dir 返回路径的目录。

package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	// 获取文件基本名和目录
	path := "/path/to/file.txt"
	base := filepath.Base(path)
	dir := filepath.Dir(path)

	fmt.Println("Base:", base)
	fmt.Println("Directory:", dir)
}

清理和解析路径

filepath.Clean 函数返回与输入路径等效的最短路径名,filepath.Abs 返回绝对路径。

package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	// 清理和解析路径
	uncleanPath := "/path/../file.txt"
	cleanPath := filepath.Clean(uncleanPath)

	absPath, err := filepath.Abs(uncleanPath)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	fmt.Println("Unclean path:", uncleanPath)
	fmt.Println("Clean path:", cleanPath)
	fmt.Println("Absolute path:", absPath)
}

目录

package main

import (
	"fmt"
	"os"
)

func main() {
	// 创建目录
	err := os.Mkdir("mydirectory", 0755)
	if err != nil {
		fmt.Println("Error creating directory:", err)
		return
	}

	fmt.Println("Directory created successfully!")

	// 删除目录
	err = os.Remove("mydirectory")
	if err != nil {
		fmt.Println("Error removing directory:", err)
		return
	}

	fmt.Println("Directory removed successfully!")
}

临时文件和目录

在 Go 中,可以使用 osio 包来处理临时文件和目录。

临时文件

package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	// 创建临时文件
	tempFile, err := os.CreateTemp("", "example")
	if err != nil {
		fmt.Println("Error creating temporary file:", err)
		return
	}
	defer os.Remove(tempFile.Name()) // 清理:完成后删除临时文件

	// 向临时文件写入一些数据
	data := []byte("Hello, temporary file!\n")
	_, err = tempFile.Write(data)
	if err != nil {
		fmt.Println("Error writing to temporary file:", err)
		return
	}

	// 从临时文件读取
	tempFile.Seek(0, io.SeekStart)
	buffer := make([]byte, len(data))
	_, err = tempFile.Read(buffer)
	if err != nil {
		fmt.Println("Error reading from temporary file:", err)
		return
	}

	// 打印临时文件的内容
	fmt.Println("Contents of the temporary file:")
	fmt.Println(string(buffer))
}

临时目录

package main

import (
	"fmt"
	"os"
)

func main() {
	// 创建临时目录
	tempDir, err := os.MkdirTemp("", "exampleDir")
	if err != nil {
		fmt.Println("Error creating temporary directory:", err)
		return
	}
	defer os.RemoveAll(tempDir) // 清理:完成后删除临时目录

	// 打印临时目录的路径
	fmt.Println("Temporary directory:", tempDir)

	// 在临时目录中创建一个文件:
	tempFile, err := os.CreateTemp(tempDir, "exampleFile.txt")
	if err != nil {
		fmt.Println("Error creating temporary file:", err)
		return
	}
	os.Remove(tempFile.Name()) // 清理:完成后删除临时文件
}

代码挑战

编写一个函数,该函数以两个文件路径作为输入,并判断一个路径是否是另一个路径的子路径。

Loading...
> 此处输出代码运行结果
上页
下页