51、Go语言基础 - 文件系统 - 目录操作

作者: 温新

分类: 【Go基础】

阅读: 343

时间: 2023-12-05 00:43:19

hi,我是温新

本篇文章学习文件的相关操作,如创建目录、删除目录等。关于文件操作,都是在 os 这个包中。

创建目录

os.Mkdir 函数用于在指定的路径上创建一个目录。其格式如下:

func Mkdir(name string, perm FileMode) error

参数解释:

  • name 是要创建的目录的路径。
  • perm 是创建的目录的权限模式,通常使用八进制表示(例如 0755)。

os.Mkdir 将创建一个具有指定名称和权限的目录。以下是一个示例:

package main

import (
	"fmt"
	"os"
)

func main() {
    // 使用 os.Mkdir 创建一个目录名为 "mydir",并赋予它权限 0775
    err := os.Mkdir("mydir", 0775)
    
    if err != nil {
        // 如果创建目录时出现错误,将错误信息打印并触发 panic
        panic(err)
    }

    // 如果成功创建目录,打印 "mkdir successful"
    fmt.Println("mkdir successful")
}

创建多级目录

MkdirAll 函数用于创建多级目录,包括父目录和子目录。其格下如下:

func MkdirAll(path string, perm FileMode) error

参数解释:

  • path 是要创建的目录的路径,可以是多级目录的路径。
  • perm 是创建的目录的权限模式,通常使用八进制表示。

以下是一个示例代码,演示如何使用 MkdirAll 创建多级目录:

package main

import (
	"fmt"
	"os"
)

func main() {
	// 使用 os.MkdirAll 创建多级目录结构,并赋予它权限 0755
	err := os.MkdirAll("mydir1/mychid/son", 0775)
    if err != nil {
        // 如果创建目录时出现错误,将错误信息打印
        fmt.Println("Error:", err)
    } else {
        // 如果成功创建目录,打印 "Directories created successfully"
        fmt.Println("Directories created successfully")
    }
}

列出目录内容

ReadDir 函数用于读取目录中的文件和子目录列表。其格式如下:

func ReadDir(name string) ([]DirEntry, error)

参数解释:

  • name 是要读取的目录的路径。

ReadDir 返回一个 []DirEntry 切片,其中每个元素代表目录中的一个条目(文件或子目录),以及一个 error,用于指示是否出现任何错误。

以下是一个使用 ReadDir 的简单示例:

package main

import (
	"fmt"
	"os"
)

func main() {
	// 使用 os.ReadDir 读取 mydir1 目录中的文件和子目录列表
	entries, err := os.ReadDir("mydir1")

	if err != nil {
		// 如果读取目录时出现错误,将错误信息打印
		fmt.Println("Error:", err)
	} else {
		// 遍历目录中的条目并打印它们的名称
		for _, entry := range entries {
			if !entry.IsDir() {
				fmt.Println("文件名", entry.Name())
			} else {
				fmt.Println("目录名", entry.Name())
			}
		}
	}
}

输出结果:

文件名 a.txt
目录名 mychid
目录名 test

这个示例使用 os.ReadDir 读取 mydir1 目录中的文件和子目录列表。

递归遍历目录及目录下的文件

os.Readdir 函数通常用于读取指定目录中的文件和子目录,但它不会递归遍历子目录。利用递归来实现遍历目录下的所有文件和目录

package main

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

func visitDir(path string) {
	// 打开目录
	dir, err := os.Open(path)
	if err != nil {
		fmt.Println("Error opening directory:", err)
		return
	}
	defer dir.Close() // 确保在函数退出时关闭目录

	// 读取目录下的所有文件和子目录
	entries, err := dir.Readdir(-1) // -1 表示读取所有文件和子目录
	if err != nil {
		fmt.Println("Error reading directory:", err)
		return
	}

	// 遍历目录下的文件和子目录
	for _, entry := range entries {
		if entry.IsDir() {
			// 如果是子目录,打印并递归遍历
			fmt.Println("目录:", filepath.Join(path, entry.Name()))
			visitDir(filepath.Join(path, entry.Name()))
		} else {
			// 如果是文件,打印文件路径
			fmt.Println("文件:", filepath.Join(path, entry.Name()))
		}
	}
}

func main() {
	root := "mydir1" // 要遍历的根目录
	visitDir(root)   // 调用递归遍历函数
}

输出结果

目录: mydir1\mychid
文件: mydir1\mychid\redme.txt
目录: mydir1\mychid\son

删除空目录

os.Remove 函数用于删除指定的文件或目录。其格式如下:

func Remove(name string) error

参数解释:

  • name 是要删除的文件或目录的路径。

os.Remove 将删除指定的文件或目录。如果成功,它返回 nil,如果出现错误,则返回一个 error

package main

import (
	"fmt"
	"os"
)

func main() {
	// 删除 mydir 目录
	err := os.Remove("mydir")
	if err != nil {
		// 如果删除文件时出现错误,将错误信息打印
		fmt.Println("Error:", err)
	} else {
		// 如果成功删除文件,打印 "File deleted successfully"
		fmt.Println("File deleted successfully")
	}
}

若是删除文件夹,Remove 只能用于删除一个空文件,若文件夹不为空会报错:Error: remove mydir: The directory is not empty.

递归删除目录

os.RemoveAll 函数用于递归删除指定的目录及其所有子目录和文件。其格式如下:

func RemoveAll(path string) error

参数解释:

  • path 是要删除的目录的路径。

os.RemoveAll 将删除指定的目录及其所有内容。如果成功,它返回 nil,如果出现错误,则返回一个 error

以下是一个使用 os.RemoveAll 的简单示例

package main

import (
	"fmt"
	"os"
)

func main() {
	// 使用 os.RemoveAll 递归删除名为 "mydir1" 的目录及其所有内容
	err := os.RemoveAll("mydir1")
	if err != nil {
		// 如果删除目录时出现错误,将错误信息打印
		fmt.Println("Error:", err)
	} else {
		// 如果成功删除目录,打印 "Directory and its contents deleted successfully"
		fmt.Println("Directory and its contents deleted successfully")
	}
}

这个示例使用 os.RemoveAll 递归删除了名为 "mydir" 的目录以及其所有子目录和文件。

这是一个非常危险的方法,使用时一定要注意!!!

请登录后再评论