Go FS
Go 语言提供了强大的文件系统操作功能,主要通过标准库 os、io 和 path/filepath 来实现。以下是 Go 文件系统相关操作的简要总结:
1. 文件和目录操作
1.1 打开文件
使用 os.Open 打开一个文件,如果文件不存在会返回错误。如果文件不存在,需要使用 os.OpenFile 创建或打开文件。
go
package main
import (
"fmt"
"os"
)
func main() {
// 打开文件
file, err := os.Open("example.txt")
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
fmt.Println("File opened successfully:", file.Name())
}1.2 创建文件
使用 os.Create 创建一个新文件。如果文件已存在,会截断文件(清空文件内容)。
go
package main
import (
"fmt"
"os"
)
func main() {
file, err := os.Create("newfile.txt")
if err != nil {
fmt.Println("Error creating file:", err)
return
}
defer file.Close()
fmt.Println("File created successfully:", file.Name())
}1.3 删除文件
使用 os.Remove 删除文件。
go
package main
import (
"fmt"
"os"
)
func main() {
err := os.Remove("newfile.txt")
if err != nil {
fmt.Println("Error removing file:", err)
return
}
fmt.Println("File removed successfully")
}1.4 检查文件信息
使用 os.Stat 获取文件的详细信息(如大小、权限、修改时间等)。
go
package main
import (
"fmt"
"os"
)
func main() {
info, err := os.Stat("example.txt")
if err != nil {
fmt.Println("Error stating file:", err)
return
}
fmt.Println("File Info:", info)
fmt.Println("File Size:", info.Size())
fmt.Println("Last Modified:", info.ModTime())
}1.5 目录操作
创建目录可以使用 os.Mkdir 或 os.MkdirAll(递归创建目录)。
go
package main
import (
"fmt"
"os"
)
func main() {
err := os.Mkdir("newdir", 0755) // 创建单一目录
if err != nil {
fmt.Println("Error creating directory:", err)
return
}
err = os.MkdirAll("newdir/subdir", 0755) // 递归创建目录
if err != nil {
fmt.Println("Error creating subdirectory:", err)
return
}
fmt.Println("Directory created successfully")
}1.6 删除目录
删除空目录使用 os.Remove,删除非空目录可以使用 os.RemoveAll。
go
package main
import (
"fmt"
"os"
)
func main() {
err := os.Remove("newdir")
if err != nil {
fmt.Println("Error removing directory:", err)
return
}
fmt.Println("Directory removed successfully")
}2. 读取文件内容
使用 os.Open 打开文件,然后可以通过 io.Reader 读取文件内容。
2.1 读取文件到内存
使用 ioutil.ReadFile (在 Go 1.16 后,ioutil 已被废弃,推荐使用 os.ReadFile)读取整个文件到内存。
go
package main
import (
"fmt"
"os"
)
func main() {
content, err := os.ReadFile("example.txt")
if err != nil {
fmt.Println("Error reading file:", err)
return
}
fmt.Println("File Content:\n", string(content))
}2.2 逐行读取文件
使用 bufio.Scanner 来逐行读取文件。
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 reading file:", err)
}
}3. 写入文件内容
3.1 写入文件
使用 os.WriteFile(Go 1.16 后推荐)直接写入文件。
go
package main
import (
"fmt"
"os"
)
func main() {
content := []byte("Hello, Go File System!")
err := os.WriteFile("output.txt", content, 0644)
if err != nil {
fmt.Println("Error writing to file:", err)
return
}
fmt.Println("Content written to file")
}3.2 追加写入文件
使用 os.OpenFile 以追加模式打开文件。
go
package main
import (
"fmt"
"os"
)
func main() {
file, err := os.OpenFile("output.txt", os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
_, err = file.WriteString("\nAppended Content!")
if err != nil {
fmt.Println("Error writing to file:", err)
return
}
fmt.Println("Content appended to file")
}4. 文件路径和目录操作
4.1 文件路径操作
使用 path/filepath 包进行文件路径的操作,比如获取文件的绝对路径、拼接路径等。
go
package main
import (
"fmt"
"path/filepath"
)
func main() {
absPath, err := filepath.Abs("example.txt")
if err != nil {
fmt.Println("Error getting absolute path:", err)
return
}
fmt.Println("Absolute Path:", absPath)
// 路径拼接
newPath := filepath.Join("dir", "subdir", "file.txt")
fmt.Println("Joined Path:", newPath)
}4.2 遍历目录
使用 filepath.Walk 遍历目录及其子目录。
go
package main
import (
"fmt"
"path/filepath"
"os"
)
func main() {
err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error {
if err != nil {
fmt.Println("Error walking the path:", err)
return err
}
fmt.Println("Visited:", path)
return nil
})
if err != nil {
fmt.Println("Error:", err)
}
}5. 文件权限
使用 os.Chmod 修改文件权限。
go
package main
import (
"fmt"
"os"
)
func main() {
err := os.Chmod("example.txt", 0644) // 设置文件权限
if err != nil {
fmt.Println("Error changing file permissions:", err)
return
}
fmt.Println("File permissions changed successfully")
}总结
Go 提供了丰富的文件系统操作功能,主要通过以下标准库:
os:用于文件和目录的基本操作(如打开、创建、删除文件和目录等)。io和bufio:用于读取和写入文件内容,支持逐行读取和缓冲区操作。path/filepath:用于处理文件路径和遍历目录。
通过这些功能,Go 可以高效地进行文件系统管理、读取和写入操作。