ZetCode

Go 列出目录

最后修改时间 2024 年 4 月 11 日

在本文中,我们将展示如何在 Golang 中使用目录。我们创建目录、删除目录、重命名目录以及列出目录内容。

目录定义

目录是计算机文件系统中用于存储和定位文件的单元。目录以层级结构组织成树状。目录具有父子关系。目录有时也称为文件夹。

我们使用 osfilepath 包。

使用 os.Mkdir 创建 Go 目录

os.Mkdir 使用指定的名称和权限位创建一个新目录。

create_directory.go
package main

import (
    "log"
    "os"
)

func main() {

    err := os.Mkdir("tmp", 0755)

    if err != nil {
        log.Fatal(err)
    }
}

示例创建一个名为 tmp 的目录。0755 表示所有人都有读和执行权限,文件所有者也有写权限。

使用 os.MkdirAll 创建多个 Go 目录

MkdirAll 函数会创建目录,包括所有必需的父目录,并返回 nil,否则返回一个错误。权限位用于函数创建的所有目录。如果目录已存在,MkdirAll 不执行任何操作并返回 nil

makeall.go
package main

import (
    "fmt"
    "log"
    "os"
)

func main() {

    path := "tmp/doc/new"

    err := os.MkdirAll(path, 0755)

    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("directory created")
}

在此代码示例中,我们创建一个名为 new 的目录及其父目录。

使用 os.Getwd 获取当前工作目录

os.Getwd 返回一个指向当前目录的根路径名。

current_directory.go
package main

import (
    "fmt"
    "log"
    "os"
)

func main() {

    path, err := os.Getwd()

    if err != nil {
        log.Println(err)
    }

    fmt.Println(path)
}

示例打印当前工作目录。这是我们启动程序的目录。

检查目录是否存在

IsNotExist 返回一个布尔值,指示错误是否已知报告文件或目录不存在。

check_dir_exists.go
package main

import (
    "fmt"
    "os"
)

func main() {

    path := "tmp"

    if _, err := os.Stat(path); os.IsNotExist(err) {

        os.Mkdir(path, 0755)
        fmt.Println("Directory created")
    } else {

        fmt.Println("Directory already exists")
    }
}

在此代码示例中,如果目录不存在,我们则创建它。如果目录存在,我们则打印一条消息。

if _, err := os.Stat(path); os.IsNotExist(err) {

首先,我们使用 Stat 函数,它返回描述文件的 FileInfo 结构。如果此函数返回错误,我们使用 IsNotExist 来确定错误是否由目录已存在引起。

使用 os.Rename 重命名目录

Rename 函数将源重命名(移动)到目标。

rename_directory.go
package main

import (
    "fmt"
    "log"
    "os"
)

func main() {

    oldpath := "tmp"
    newpath := "tmp2"

    err := os.Rename(oldpath, newpath)

    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("directory renamed")
}

示例将目录 tmp 重命名为 tmp2

使用 os.Remove 删除目录

使用 os.Remove 函数,我们可以删除单个目录;该目录必须为空。

remove_single.go
package main

import (
    "log"
    "os"
)

func main() {

    err := os.Remove("tmp")

    if err != nil {
        log.Fatal(err)
    }
}

示例删除一个空的 tmp 目录。

使用 os.RemoveAll 删除目录及其内容

RemoveAll 会递归地删除目录及其内容。

remove_all.go
package main

import (
    "log"
    "os"
)

func main() {

    err := os.RemoveAll("tmp")

    if err != nil {
        log.Fatal(err)
    }
}

示例删除 tmp 目录及其所有文件和子目录。

使用 filepath.Glob 列出目录

filepath.Glob 返回所有匹配模式的文件名,如果没有匹配的文件则返回 nil

func Glob(pattern string) (matches []string, err error)

这是 filepath.Glob 函数的语法。

globbing.go
package main

import (
    "fmt"
    "log"
    "path/filepath"
)

func main() {

    files, err := filepath.Glob("/home/janbodnar/Documents/prog/golang/**/*.go")

    if err != nil {
        log.Fatal(err)
    }

    for _, file := range files {

        fmt.Println(file)
    }
}

示例列出给定目录中的所有 Go 文件。使用 ** 模式,列出是递归的。

来源

Go os 包 - 参考

在本文中,我们已在 Go 中使用过目录。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Go 教程