文件处理
在 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 中,可以使用 os
和 io
包来处理临时文件和目录。
临时文件
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...
> 此处输出代码运行结果