Skip to content

Go FS

Go 语言提供了强大的文件系统操作功能,主要通过标准库 osiopath/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.Mkdiros.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:用于文件和目录的基本操作(如打开、创建、删除文件和目录等)。
  • iobufio:用于读取和写入文件内容,支持逐行读取和缓冲区操作。
  • path/filepath:用于处理文件路径和遍历目录。

通过这些功能,Go 可以高效地进行文件系统管理、读取和写入操作。