工作目录

为常驻程序设置工作目录是非常必要的。

常驻程序通常常需要从本地读写数据, 提供一个基于工作目录的文件系统交互接口,可以有效提升编码效率和代码的规范化。这就是辅助包 dir 的作用。

下面就该辅助包的一些常用场景进行演示。

初始化

import "github.com/x-mod/dir"

workdir := dir.New(
    dir.Root("/path/to/workdir"), // 默认工作目录 .
    dir.Folder("config"),         // 增加子文件夹 config
    dir.Folder("logs"),           // 增加子文件夹 logs
)

if err := workdir.Open(); err != nil {
    return err
}

以上代码就会初始化工作目录。必须保证设置的根目录存在,否则会报错。子目录不存在时,会自动创建相应的字目录。

常规操作

常规操作,主要包括:

//判断子目录是否存在
//func (d *Dir) DirExists(elems ...string) (bool, error)
exist, err := workdir.DirExists("logs", "20220515") // 判断 [root]/logs/20220515

//判断文件是否存在
//func (d *Dir) Exists(elems ...string) (bool, error)
exist, err := workdir.Exists("logs", "20220515","info.log") // 判断 [root]/logs/20220515/info.log

//获取目录内的文件名
// func (d *Dir) Files(elems ...string) ([]string, error)
files, err := workdir.Files("config")

//获取目录内的子文件夹
// func (d *Dir) Folders(elems ...string) ([]string, error)
folders, err := workdir.Folders("logs")

//判断文件夹是否为空
// func (d *Dir) IsEmpty(elems ...string) (bool, error)
empty, err := workdir.IsEmpty("config")

//创建子目录
//func (d *Dir) Mkdir(elems ...string) (string, error)
pathname, err := workdir.Mkdir("logs", "20220515", "errors") // 创建 [root]/logs/20220515/errors/

//获取绝对路径
//func (d *Dir) Path(elems ...string) string
abspath := workdir.Path("logs", "20220515","info.log") // abs[root]/logs/20220515/info.log

//删除文件夹
//func (d *Dir) Remove(elems ...string) error
workdir.Remove("configs")

//删除非空文件夹
//func (d *Dir) RemoveAll(elems ...string) error
workdir.RemoveAll("logs")

内嵌资源

Go 1.17 之后增加了 embed 内嵌资源的功能。为了方便,将开发过程中的内嵌资源复制到实际的工作目录中。dir 辅助包增加了相应的内嵌操作。

第一步,在 main.go 主入口函数中,定义程序内嵌资源。

package main

import (
    "github.com/x-mod/dir"
)

//go:embed embed/config/*
var embeddir embed.FS

func main() {
	dir.EmbedFS = embeddir //全局设置内嵌
	
    ...
}

第二步,在服务启动过程中,将内嵌资源复制到工作目录中。

import (
    "github.com/x-mod/dir"
)

//初始化工作目录
workdir := dir.New(
    dir.Root("/path/to/workdir"), // 默认工作目录 .
    dir.Folder("config"),         // 增加子文件夹 config
)
if err := workdir.Open(); err != nil {
    return err
}

//将内嵌资源复制到 config 子目录
if err := workdir.EmbedSkip(1, "embed"); err != nil {
	return fmt.Errorf("workdir embed: %w", err)
}

运行程序就会发现内嵌资源复制到指定的工作子目录中了。

← 堆计时器 None

评论