跳到主要内容

file

file 库是 yaklang 的文件与路径操作工具箱,覆盖读写、创建删除、遍历、路径处理、类型/MIME 识别、哈希计算等近 50 个函数,是本地文件处理的核心依赖。

典型使用场景:

  • 读写:file.ReadFile / file.ReadLines / file.ReadAll 读取,file.Save / file.SaveJson 写入,file.Open / file.OpenFile / file.Create / file.TempFile 打开句柄,file.TailF 跟踪追加。
  • 文件操作:file.Cp / file.Mv / file.Rmfile.Remove)/ file.Mkdir / file.MkdirAll / file.Rename
  • 路径处理:file.Join / file.Abs / file.Clean / file.Dir / file.GetBase / file.GetExt / file.Split
  • 信息与遍历:file.IsExisted / file.IsDir / file.IsFile / file.Statfile.Ls / file.Dir / file.Walk 遍历,file.Md5 / file.Sha256 计算哈希。
  • 类型识别:file.DetectFileType / file.DetectMIMETypeFromFile / file.DetectMIMETypeFromRaw,以及 file.MatchMalicious 恶意文件匹配。

与相邻库的关系:file 是基础 I/O 库,与 filesys(文件系统抽象遍历)、os(系统)、io/bufio(流)、mimetype(类型)协同,几乎所有需要落地/读取数据的脚本都会用到。

快速上手(创建目录 - 写入 - 判断 - 按行读取 - 清理):

dir = file.Join(os.TempDir(), "yak-file-overview-demo") // 用临时目录, 避免污染真实路径
file.MkdirAll(dir) // 递归创建目录
p = file.Join(dir, "note.txt")
file.Save(p, "line1\nline2")~ // 写入文件(~ 自动处理错误)

println("exists:", file.IsExisted(p)) // 预期输出: exists: true
lines = file.ReadLines(p) // 按行读取
println("line count:", len(lines)) // 预期输出: line count: 2
assert len(lines) == 2, "should read 2 lines"

file.Remove(dir) // 递归清理
assert !file.IsExisted(dir), "dir should be removed"

共 50 个函数、9 个实例

实例

实例名类型说明
O_APPENDint1024
O_CREATEint64
O_EXCLint128
O_RDONLYint0
O_RDWRint2
O_SYNCint1052672
O_TRUNCint512
O_WRONLYint1
SEPARATORstring"/"

函数索引

函数参数返回值说明
file.Absi stringstring返回一个路径的绝对路径
file.Cati string-模拟 unix 命令 cat,打印文件内容到标准输出
file.Cleans stringstring清理路径中的多余的分隔符和 . 和 ..
file.Cpsrc string, dst stringerror拷贝文件或目录,返回错误
file.Createname string*_yakFile, error创建一个文件,返回一个文件结构体引用与错误
file.DetectFileTypefilePath stringstring, error统一的文件类型识别函数,使用魔数识别文件类型
file.DetectMIMETypeFromFilepath string*MIME, error读取文件并通过魔数识别其 MIME 类型
file.DetectMIMETypeFromRawraw []byte*MIME通过字节内容(魔数)识别 MIME 类型
file.Diri string[]*utils.FileInfoLs 列出一个目录下的所有文件和目录,返回一个文件信息切片
file.GetBases stringstring获取文件的基本名
file.GetDirPathpath stringstring返回路径中除最后一个元素之后的路径,这通常是原本路径的目录
file.GetExts stringstring获取文件的扩展名
file.GetTypeByExtensionext stringstring根据文件扩展名获取 MIME 类型
file.IsAbspath stringbool判断路径是否是绝对路径
file.IsDirpath stringbool判断路径是否存在且是一个目录
file.IsExistedpath stringbool判断文件或目录是否存在
file.IsFilepath stringbool判断路径是否存在且是一个文件
file.IsLinkfile stringbool判断文件是否是一个符号链接
file.Lsi string[]*utils.FileInfoDir 列出一个目录下的所有文件和目录,返回一个文件信息切片,它是 Ls 的别名
file.Lstatname stringos.FileInfo, error返回一个文件的信息和错误,如果文件是一个符号链接,返回的是符号链接的信息
file.MatchMaliciousinput any[]string, error检测文件或内容是否包含恶意特征
file.MatchMaliciousWithDetailsinput any[]map[string]any, error检测文件或内容并返回详细信息
file.Md5filepath stringstring计算文件的 MD5 哈希值
file.Mkdirname stringerror创建一个目录,返回错误
file.MkdirAllname stringerror递归创建一个目录(包括所有不存在的父目录),返回错误
file.Mvoldpath string, newpath stringerror重命名一个文件或文件夹,返回错误,这个函数也会移动文件或文件夹,它是 Rename 的别名
file.NewMaliciousFileMatcher-*MaliciousFileMatcher创建一个恶意文件特征匹配器,内置常见 webshell/恶意代码特征
file.Openname string*_yakFile, error打开一个文件,返回一个文件结构体引用与错误
file.OpenFilename string, flags int, mode os.FileMode*_yakFile, error打开一个文件,使用 file.O_CREATE ... 和权限控制,返回一个文件结构体引用与错误
file.ReadAllr io.Reader[]byte, error从 Reader 读取直到出现错误或 EOF,然后返回字节切片与错误
file.ReadDirInfoInDirectorypath string[]*utils.FileInfo, error递归读取一个目录下的所有子目录信息,返回一个文件信息切片和错误
file.ReadFilefilename string[]byte, error读取一个文件的所有内容,返回字节切片与错误
file.ReadFileInfoInDirectorypath string[]*utils.FileInfo, error递归读取一个目录下的所有文件信息,返回一个文件信息切片和错误
file.ReadLinesi any[]string尝试读取一个文件中的所有行,返回一个字符串切片,会去除BOM头和空行
file.ReadLinesWithCallbacki any, callback func(string)error尝试读取一个文件中的所有行,每读取一行,便会调用回调函数,返回错误
file.Removepath stringerror删除路径及其包含的所有子路径
file.Renameoldpath string, newpath stringerror重命名一个文件或文件夹,返回错误,这个函数也会移动文件或文件夹
file.Rmpath stringerror删除路径及其包含的所有子路径,它是 Remove 的别名
file.SavefileName string, i anyerror将字符串或字节切片或字符串切片写入到文件中,如果文件不存在则创建,如果文件存在则覆盖,返回错误
file.SaveJsonname string, i anyerror将字符串或字节切片或字符串切片写入到文件中,如果文件不存在则创建,如果文件存在则覆盖,返回错误
file.Sha1filepath stringstring计算文件的 SHA1 哈希值
file.Sha256filepath stringstring计算文件的 SHA256 哈希值
file.Splitpath stringstring, string以操作系统的默认路径分隔符分割路径,返回目录和文件名
file.Statname stringos.FileInfo, error返回一个文件的信息和错误
file.TailFi string, line func(i string)-模拟 unix 命令 tail -f,执行这个函数会一直阻塞,监听文件内容变化,如果文件有变化,会自动通过回调通知新的内容
file.WalkuPath string, i func(info *utils.FileInfo) boolerror遍历一个目录下的所有文件和目录,对每一项调用回调函数,返回错误

可变参数函数索引

函数参数返回值说明
file.Joinpath ...stringstring将任意数量的路径以默认路径分隔符链接在一起
file.NewMultiFileLineReaderfiles ...string*mfreader.MultiFileLineReader, error创建一个多文件读取器,返回一个多文件读取器结构体引用和错误
file.TempFiledirPart ...string*_yakFile, error创建一个临时文件,返回一个文件结构体引用与错误
file.TempFileNamepattern ...stringstring, error创建一个临时文件,返回一个文件名与错误

函数详情

Abs

Abs(i string) string

返回一个路径的绝对路径

参数

参数名类型说明
istring输入路径(支持以 ~ 开头表示家目录)

返回值

序号类型说明
r1string对应的绝对路径

示例

// 假设当前目录是 /tmp
file.Abs("./test.txt") // /tmp/test.txt

Cat

Cat(i string)

模拟 unix 命令 cat,打印文件内容到标准输出

参数

参数名类型说明
istring待打印的文件路径

示例

// 关键词: file.Cat, 打印文件内容
p = file.Join(os.TempDir(), "yak-cat-demo.txt")
file.Save(p, "hello yak")~ // 先准备一个文件
file.Cat(p) // 将文件内容打印到标准输出, 这里会打印 hello yak
file.Remove(p)

Clean

Clean(s string) string

清理路径中的多余的分隔符和 . 和 ..

参数

参数名类型说明
sstring输入路径

返回值

序号类型说明
r1string规整化后的最短等价路径

示例

p = file.Clean("/tmp/../tmp/test.txt")
println(p) // OUT: /tmp/test.txt
assert p == "/tmp/test.txt", "Clean should normalize the path"

Cp

Cp(src string, dst string) error

拷贝文件或目录,返回错误

参数

参数名类型说明
srcstring源文件或目录路径
dststring目标文件或目录路径

返回值

序号类型说明
r1error错误信息

示例

// 关键词: file.Cp, 复制文件/目录
dir = file.Join(os.TempDir(), "yak-cp-demo")
file.MkdirAll(dir)
src = file.Join(dir, "src.txt")
dst = file.Join(dir, "dst.txt")
file.Save(src, "hello yak")~ // 先准备一个源文件
file.Cp(src, dst)~ // 复制到目标
println("dst content:", string(file.ReadFile(dst)~)) // 预期输出: dst content: hello yak
assert string(file.ReadFile(dst)~) == "hello yak", "copied content should match source"
file.Remove(dir)

Create

Create(name string) (*_yakFile, error)

创建一个文件,返回一个文件结构体引用与错误

参数

参数名类型说明
namestring待创建的文件路径

返回值

序号类型说明
r1*_yakFile文件结构体引用
r2error错误信息

示例

// 关键词: file.Create, 创建文件并写入
p = file.Join(os.TempDir(), "yak-create-demo.txt")
f = file.Create(p)~
f.WriteString("hello yak") // 通过文件句柄写入内容
f.Close() // 记得关闭句柄
assert string(file.ReadFile(p)~) == "hello yak", "content should be written"
file.Remove(p)

DetectFileType

DetectFileType(filePath string) (string, error)

统一的文件类型识别函数,使用魔数识别文件类型

支持常见操作系统(Linux、Windows、macOS)中的各种文件格式

参数

参数名类型说明
filePathstring文件路径

返回值

序号类型说明
r1stringMIME 类型字符串
r2error错误信息,如果无法识别文件类型则返回错误

示例

mimeType, err = file.DetectFileType("/path/to/file")

if err == nil {
println(mimeType) // "text/plain" 或 "application/pdf" 等
}

DetectMIMETypeFromFile

DetectMIMETypeFromFile(path string) (*MIME, error)

读取文件并通过魔数识别其 MIME 类型

参数

参数名类型说明
pathstring待识别的文件路径

返回值

序号类型说明
r1*MIMEMIME 类型对象,识别失败时为 application/octet-stream
r2error错误信息(与打开/读取文件相关)

示例

// 写入 PNG 文件头后识别文件类型
p = file.Join(os.TempDir(), "yak-mime-example.png")
file.Save(p, codec.DecodeHex("89504e470d0a1a0a")~)~
mime, err = file.DetectMIMETypeFromFile(p)
assert err == nil, "DetectMIMETypeFromFile should not fail on readable file"
assert mime.String() == "image/png", "PNG file should be detected as image/png"
file.Remove(p)

DetectMIMETypeFromRaw

DetectMIMETypeFromRaw(raw []byte) *MIME

通过字节内容(魔数)识别 MIME 类型

参数

参数名类型说明
raw[]byte待识别的字节内容

返回值

序号类型说明
r1*MIMEMIME 类型对象,识别失败时为 application/octet-stream

示例

// PNG 文件头魔数应被识别为 image/png
pngHeader = codec.DecodeHex("89504e470d0a1a0a")~
mime = file.DetectMIMETypeFromRaw(pngHeader)
println(mime.String()) // OUT: image/png
assert mime.String() == "image/png", "PNG magic should be detected as image/png"

Dir

Dir(i string) []*utils.FileInfo

Ls 列出一个目录下的所有文件和目录,返回一个文件信息切片

参数

参数名类型说明
istring待列出的目录路径

返回值

序号类型说明
r1[]*utils.FileInfo目录下文件和子目录的文件信息切片

示例

for f in file.Ls("/tmp") {
println(f.Name)
}

GetBase

GetBase(s string) string

获取文件的基本名

参数

参数名类型说明
sstring文件路径

返回值

序号类型说明
r1string路径最后一段(文件名)

示例

base = file.GetBase("/tmp/test.txt")
println(base) // OUT: test.txt
assert base == "test.txt", "GetBase should return the file name"

GetDirPath

GetDirPath(path string) string

返回路径中除最后一个元素之后的路径,这通常是原本路径的目录

参数

参数名类型说明
pathstring输入路径

返回值

序号类型说明
r1string路径所在目录(带结尾分隔符)

示例

dir = file.GetDirPath("/usr/bin/bash")
println(dir) // OUT: /usr/bin/
assert dir == "/usr/bin/", "GetDirPath should return the directory with trailing separator"

GetExt

GetExt(s string) string

获取文件的扩展名

参数

参数名类型说明
sstring文件路径

返回值

序号类型说明
r1string扩展名(含点,如 .txt),无扩展名返回空字符串

示例

ext = file.GetExt("/tmp/test.txt")
println(ext) // OUT: .txt
assert ext == ".txt", "GetExt should return the file extension"

GetTypeByExtension

GetTypeByExtension(ext string) string

根据文件扩展名获取 MIME 类型

参数

参数名类型说明
extstring文件扩展名(可以带或不带点号,如 ".txt" 或 "txt")

返回值

序号类型说明
r1stringMIME 类型字符串,如果未找到则返回 "application/octet-stream"

示例

mimeType = file.GetTypeByExtension(".txt")
// 不同平台可能带不同的 charset 后缀,仅断言主类型
assert str.Contains(mimeType, "text/plain"), "txt extension should map to text/plain"

IsAbs

IsAbs(path string) bool

判断路径是否是绝对路径

参数

参数名类型说明
pathstring待判断的路径

返回值

序号类型说明
r1bool是否为绝对路径

示例

println(file.IsAbs("/usr/bin/bash"))   // OUT: true
assert file.IsAbs("/usr/bin/bash") == true, "absolute path should be detected"
assert file.IsAbs("../../usr/bin") == false, "relative path should not be absolute"

IsDir

IsDir(path string) bool

判断路径是否存在且是一个目录

参数

参数名类型说明
pathstring待判断的路径

返回值

序号类型说明
r1bool路径是否存在且为目录

示例

// 关键词: file.IsDir, 判断是否为目录
dir = file.Join(os.TempDir(), "yak-isdir-demo")
file.MkdirAll(dir)
p = file.Join(dir, "a.txt")
file.Save(p, "x")~
println("dir is dir:", file.IsDir(dir), "; file is dir:", file.IsDir(p))
assert file.IsDir(dir), "a directory should be a dir"
assert !file.IsDir(p), "a regular file should not be a dir"
file.Remove(dir)

IsExisted

IsExisted(path string) bool

判断文件或目录是否存在

参数

参数名类型说明
pathstring待判断的路径

返回值

序号类型说明
r1bool路径是否存在

示例

// 关键词: file.IsExisted, 判断路径是否存在
p = file.Join(os.TempDir(), "yak-exist-demo.txt")
file.Save(p, "x")~
println("exist:", file.IsExisted(p)) // 预期输出: exist: true
assert file.IsExisted(p), "the file we just created should exist"
file.Remove(p)
assert !file.IsExisted(p), "the file should not exist after remove"

IsFile

IsFile(path string) bool

判断路径是否存在且是一个文件

参数

参数名类型说明
pathstring待判断的路径

返回值

序号类型说明
r1bool路径是否存在且为文件

示例

// 关键词: file.IsFile, 判断是否为文件
dir = file.Join(os.TempDir(), "yak-isfile-demo")
file.MkdirAll(dir)
p = file.Join(dir, "a.txt")
file.Save(p, "x")~
println("p is file:", file.IsFile(p), "; dir is file:", file.IsFile(dir))
assert file.IsFile(p), "a regular file should be a file"
assert !file.IsFile(dir), "a directory should not be a file"
file.Remove(dir)

IsLink(file string) bool

判断文件是否是一个符号链接

参数

参数名类型说明
filestring待判断的文件路径

返回值

序号类型说明
r1bool是否为符号链接

示例

// 关键词: file.IsLink, 判断是否为符号链接
p = file.Join(os.TempDir(), "yak-islink-demo.txt")
file.Save(p, "x")~
println("regular file is link:", file.IsLink(p)) // 预期输出: regular file is link: false
assert !file.IsLink(p), "a regular file is not a symbolic link"
file.Remove(p)
// 对真实的符号链接(如某些系统的 /usr/bin/bash)则会返回 true

Ls

Ls(i string) []*utils.FileInfo

Dir 列出一个目录下的所有文件和目录,返回一个文件信息切片,它是 Ls 的别名

参数

参数名类型说明
istring待列出的目录路径

返回值

序号类型说明
r1[]*utils.FileInfo目录下文件和子目录的文件信息切片

示例

for f in file.Dir("/tmp") {
println(f.Name)
}

Lstat

Lstat(name string) (os.FileInfo, error)

返回一个文件的信息和错误,如果文件是一个符号链接,返回的是符号链接的信息

参数

参数名类型说明
namestring待查询的文件路径

返回值

序号类型说明
r1os.FileInfo文件信息对象(符号链接本身的信息)
r2error错误信息

示例

// 关键词: file.Lstat, 获取文件信息(不跟随符号链接)
p = file.Join(os.TempDir(), "yak-lstat-demo.txt")
file.Save(p, "hello yak")~
info = file.Lstat(p)~
println("name:", info.Name(), "size:", info.Size())
assert info.Name() == "yak-lstat-demo.txt", "name should match"
file.Remove(p)

MatchMalicious

MatchMalicious(input any) ([]string, error)

检测文件或内容是否包含恶意特征

支持两种输入类型:

  • string: 文件路径,会读取文件内容进行匹配

  • []byte: 文件内容,直接匹配内容

参数

参数名类型说明
inputany文件路径(string)或文件内容([]byte)

返回值

序号类型说明
r1[]string匹配到的特征名称列表
r2error错误信息(仅当输入为文件路径且读取失败时返回)

示例

// 方式1: 匹配文件
matches, err = file.MatchMalicious("/path/to/suspicious.php")

if err == nil && len(matches) > 0 {
println("malicious signatures found:", matches)
}

// 方式2: 匹配内容
content = file.ReadFile("/path/to/suspicious.php")
matches, err = file.MatchMalicious(content)

if len(matches) > 0 {
println("malicious signatures found:", matches)
}

MatchMaliciousWithDetails

MatchMaliciousWithDetails(input any) ([]map[string]any, error)

检测文件或内容并返回详细信息

支持两种输入类型:

  • string: 文件路径,会读取文件内容进行匹配

  • []byte: 文件内容,直接匹配内容

参数

参数名类型说明
inputany文件路径(string)或文件内容([]byte)

返回值

序号类型说明
r1[]map[string]any匹配到的特征详细信息列表(含 name/category/description/severity)
r2error错误信息(仅当输入为文件路径且读取失败时返回)

示例

// 方式1: 匹配文件
details, err = file.MatchMaliciousWithDetails("/path/to/suspicious.php")

if err == nil {
for detail in details {
println(sprintf("name: %s, category: %s, severity: %s",
detail["name"], detail["category"], detail["severity"]))
}
}

// 方式2: 匹配内容
content = file.ReadFile("/path/to/suspicious.php")
details, err = file.MatchMaliciousWithDetails(content)

Md5

Md5(filepath string) string

计算文件的 MD5 哈希值

参数

参数名类型说明
filepathstring文件路径

返回值

序号类型说明
r1stringMD5 哈希值(32位十六进制字符串),如果文件不存在或读取失败则返回空字符串

示例

// 写入已知内容 "abc",其 MD5 是固定值
p = file.Join(os.TempDir(), "yak-md5-example.txt")
file.Save(p, "abc")~
md5Hash = file.Md5(p)
println(md5Hash) // OUT: 900150983cd24fb0d6963f7d28e17f72
assert md5Hash == "900150983cd24fb0d6963f7d28e17f72", "Md5 of 'abc' should be stable"
file.Remove(p)

Mkdir

Mkdir(name string) error

创建一个目录,返回错误

参数

参数名类型说明
namestring待创建的目录路径

返回值

序号类型说明
r1error错误信息

示例

// 关键词: file.Mkdir, 创建单层目录
dir = file.Join(os.TempDir(), "yak-mkdir-demo")
file.Remove(dir) // 先清理, 保证目录不存在
file.Mkdir(dir)~
assert file.IsDir(dir), "directory should be created"
file.Remove(dir)

MkdirAll

MkdirAll(name string) error

递归创建一个目录(包括所有不存在的父目录),返回错误

参数

参数名类型说明
namestring待创建的目录路径

返回值

序号类型说明
r1error错误信息

示例

// 关键词: file.MkdirAll, 递归创建多层目录
dir = file.Join(os.TempDir(), "yak-mkdirall-demo", "a", "b", "c") // 多层不存在的目录
file.MkdirAll(dir)~ // 会自动逐级创建
assert file.IsDir(dir), "nested directories should be created"
file.Remove(file.Join(os.TempDir(), "yak-mkdirall-demo"))

Mv

Mv(oldpath string, newpath string) error

重命名一个文件或文件夹,返回错误,这个函数也会移动文件或文件夹,它是 Rename 的别名

! 在 windows 下,无法将文件移动到不同的磁盘

参数

参数名类型说明
oldpathstring原路径
newpathstring目标路径

返回值

序号类型说明
r1error错误信息

示例

// 关键词: file.Mv, 移动/重命名文件(Rename 的别名)
dir = file.Join(os.TempDir(), "yak-mv-demo"); file.MkdirAll(dir)
oldp = file.Join(dir, "a.txt"); newp = file.Join(dir, "b.txt")
file.Save(oldp, "hello yak")~
file.Mv(oldp, newp)~
assert file.IsExisted(newp) && !file.IsExisted(oldp), "file should be moved"
file.Remove(dir)

NewMaliciousFileMatcher

NewMaliciousFileMatcher() *MaliciousFileMatcher

创建一个恶意文件特征匹配器,内置常见 webshell/恶意代码特征

返回值

序号类型说明
r1*MaliciousFileMatcher恶意文件特征匹配器对象

示例

matcher = file.NewMaliciousFileMatcher()
matches, err = matcher.MatchContent([]byte("<?php eval($_POST[1]);?>"))

Open

Open(name string) (*_yakFile, error)

打开一个文件,返回一个文件结构体引用与错误

参数

参数名类型说明
namestring待打开的文件路径

返回值

序号类型说明
r1*_yakFile文件结构体引用
r2error错误信息

示例

// 关键词: file.Open, file.ReadAll, 打开并读取
p = file.Join(os.TempDir(), "yak-open-demo.txt")
file.Save(p, "hello yak")~
f = file.Open(p)~
content = file.ReadAll(f)~
println("content:", string(content)) // 预期输出: content: hello yak
assert string(content) == "hello yak", "ReadAll should read file content"
f.Close()
file.Remove(p)

OpenFile

OpenFile(name string, flags int, mode os.FileMode) (*_yakFile, error)

打开一个文件,使用 file.O_CREATE ... 和权限控制,返回一个文件结构体引用与错误

参数

参数名类型说明
namestring待打开的文件路径
flagsint打开标志(如 file.O_CREATE|file.O_RDWR)
modeos.FileMode文件权限(如 0o777)

返回值

序号类型说明
r1*_yakFile文件结构体引用
r2error错误信息

示例

// 关键词: file.OpenFile, 按标志位/权限打开文件
p = file.Join(os.TempDir(), "yak-openfile-demo.txt")
// O_CREATE 不存在则创建, O_RDWR 读写, O_TRUNC 清空原内容
f = file.OpenFile(p, file.O_CREATE|file.O_RDWR|file.O_TRUNC, 0o644)~
f.WriteString("hello yak")
f.Close()
assert string(file.ReadFile(p)~) == "hello yak", "content should be written"
file.Remove(p)

ReadAll

ReadAll(r io.Reader) ([]byte, error)

从 Reader 读取直到出现错误或 EOF,然后返回字节切片与错误

参数

参数名类型说明
rio.Reader可读取的流对象(Reader)

返回值

序号类型说明
r1[]byte读取到的全部字节
r2error错误信息

示例

// 关键词: file.ReadAll, 从 Reader 读取全部字节
p = file.Join(os.TempDir(), "yak-readall-demo.txt")
file.Save(p, "hello yak")~
f = file.Open(p)~
content = file.ReadAll(f)~ // ReadAll 接收任意 Reader, 这里传文件句柄
println("content:", string(content)) // 预期输出: content: hello yak
assert string(content) == "hello yak", "should read all bytes"
f.Close(); file.Remove(p)

ReadDirInfoInDirectory

ReadDirInfoInDirectory(path string) ([]*utils.FileInfo, error)

递归读取一个目录下的所有子目录信息,返回一个文件信息切片和错误

参数

参数名类型说明
pathstring待读取的目录路径

返回值

序号类型说明
r1[]*utils.FileInfo目录下所有子目录的文件信息切片
r2error错误信息

示例

for d in file.ReadDirInfoInDirectory("/tmp")~ {
println(d.Name)
}

ReadFile

ReadFile(filename string) ([]byte, error)

读取一个文件的所有内容,返回字节切片与错误

参数

参数名类型说明
filenamestring待读取的文件路径

返回值

序号类型说明
r1[]byte文件的全部内容字节
r2error错误信息

示例

// 写入后读取,验证内容一致
p = file.Join(os.TempDir(), "yak-readfile-example.txt")
file.Save(p, "hello yak")~
content = file.ReadFile(p)~
assert string(content) == "hello yak", "ReadFile should return the file content"
file.Remove(p)

ReadFileInfoInDirectory

ReadFileInfoInDirectory(path string) ([]*utils.FileInfo, error)

递归读取一个目录下的所有文件信息,返回一个文件信息切片和错误

参数

参数名类型说明
pathstring待读取的目录路径

返回值

序号类型说明
r1[]*utils.FileInfo目录下所有文件的文件信息切片
r2error错误信息

示例

for f in file.ReadFileInfoInDirectory("/tmp")~ {
println(f.Name)
}

ReadLines

ReadLines(i any) []string

尝试读取一个文件中的所有行,返回一个字符串切片,会去除BOM头和空行

参数

参数名类型说明
iany待读取的文件路径

返回值

序号类型说明
r1[]string文件中的所有行组成的字符串切片

示例

// 写入三行后读取,验证行数与首行
p = file.Join(os.TempDir(), "yak-readlines-example.txt")
file.Save(p, "line1\nline2\nline3")~
lines = file.ReadLines(p)
println(len(lines)) // OUT: 3
assert lines[0] == "line1", "ReadLines should return the first line"
file.Remove(p)

ReadLinesWithCallback

ReadLinesWithCallback(i any, callback func(string)) error

尝试读取一个文件中的所有行,每读取一行,便会调用回调函数,返回错误

参数

参数名类型说明
iany待读取的文件路径
callbackfunc(string)每读取一行时调用的回调函数,参数为该行内容

返回值

序号类型说明
r1error错误信息

示例

// 关键词: file.ReadLinesWithCallback, 逐行回调读取
p = file.Join(os.TempDir(), "yak-readlines-cb.txt")
file.Save(p, "line1\nline2\nline3")~
count = 0
file.ReadLinesWithCallback(p, func(line) {
count++
println("got line:", line) // 每读到一行就回调一次
})~
assert count == 3, "should read 3 lines"
file.Remove(p)

Remove

Remove(path string) error

删除路径及其包含的所有子路径

参数

参数名类型说明
pathstring待删除的路径

返回值

序号类型说明
r1error错误信息

示例

// 关键词: file.Remove, 递归删除文件/目录
dir = file.Join(os.TempDir(), "yak-remove-demo"); file.MkdirAll(dir)
file.Save(file.Join(dir, "a.txt"), "x")~
file.Remove(dir)~ // 会连同子文件一起删除
assert !file.IsExisted(dir), "directory should be removed recursively"

Rename

Rename(oldpath string, newpath string) error

重命名一个文件或文件夹,返回错误,这个函数也会移动文件或文件夹

! 在 windows 下,无法将文件移动到不同的磁盘

参数

参数名类型说明
oldpathstring原路径
newpathstring目标路径

返回值

序号类型说明
r1error错误信息

示例

// 关键词: file.Rename, 重命名/移动文件
dir = file.Join(os.TempDir(), "yak-rename-demo"); file.MkdirAll(dir)
oldp = file.Join(dir, "old.txt"); newp = file.Join(dir, "new.txt")
file.Save(oldp, "hello yak")~
file.Rename(oldp, newp)~
assert !file.IsExisted(oldp), "old path should be gone"
assert string(file.ReadFile(newp)~) == "hello yak", "content should move to new path"
file.Remove(dir)

Rm

Rm(path string) error

删除路径及其包含的所有子路径,它是 Remove 的别名

参数

参数名类型说明
pathstring待删除的路径

返回值

序号类型说明
r1error错误信息

示例

// 关键词: file.Rm, 递归删除(Remove 的别名)
p = file.Join(os.TempDir(), "yak-rm-demo.txt")
file.Save(p, "x")~
file.Rm(p)~
assert !file.IsExisted(p), "file should be removed"

Save

Save(fileName string, i any) error

将字符串或字节切片或字符串切片写入到文件中,如果文件不存在则创建,如果文件存在则覆盖,返回错误

参数

参数名类型说明
fileNamestring目标文件路径
iany待写入的内容,支持字符串、字节切片或字符串切片

返回值

序号类型说明
r1error错误信息

示例

// 写入后再读回,验证内容一致
p = file.Join(os.TempDir(), "yak-save-example.txt")
file.Save(p, "hello yak")~
content = file.ReadFile(p)~
assert string(content) == "hello yak", "Save should write the content to file"
file.Remove(p)

SaveJson

SaveJson(name string, i any) error

将字符串或字节切片或字符串切片写入到文件中,如果文件不存在则创建,如果文件存在则覆盖,返回错误

与 Save 不同的是,如果传入的参数是其他类型,会尝试将其序列化为 json 字符再写入到文件中

参数

参数名类型说明
namestring目标文件路径
iany待写入的内容,非字符串/字节类型会被序列化为 JSON

返回值

序号类型说明
r1error错误信息

示例

// 写入一个 map,会被序列化为 JSON 文本
p = file.Join(os.TempDir(), "yak-savejson-example.json")
file.SaveJson(p, {"name": "yak"})~
content = file.ReadFile(p)~
assert str.Contains(string(content), "yak"), "SaveJson should write json content"
file.Remove(p)

Sha1

Sha1(filepath string) string

计算文件的 SHA1 哈希值

参数

参数名类型说明
filepathstring文件路径

返回值

序号类型说明
r1stringSHA1 哈希值(40位十六进制字符串),如果文件不存在或读取失败则返回空字符串

示例

// 写入已知内容 "abc",其 SHA1 是固定值
p = file.Join(os.TempDir(), "yak-sha1-example.txt")
file.Save(p, "abc")~
sha1Hash = file.Sha1(p)
println(sha1Hash) // OUT: a9993e364706816aba3e25717850c26c9cd0d89d
assert sha1Hash == "a9993e364706816aba3e25717850c26c9cd0d89d", "Sha1 of 'abc' should be stable"
file.Remove(p)

Sha256

Sha256(filepath string) string

计算文件的 SHA256 哈希值

参数

参数名类型说明
filepathstring文件路径

返回值

序号类型说明
r1stringSHA256 哈希值(64位十六进制字符串),如果文件不存在或读取失败则返回空字符串

示例

// 写入已知内容 "abc",其 SHA256 是固定值
p = file.Join(os.TempDir(), "yak-sha256-example.txt")
file.Save(p, "abc")~
sha256Hash = file.Sha256(p)
println(sha256Hash) // OUT: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
assert sha256Hash == "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad", "Sha256 of 'abc' should be stable"
file.Remove(p)

Split

Split(path string) (string, string)

以操作系统的默认路径分隔符分割路径,返回目录和文件名

参数

参数名类型说明
pathstring输入路径

返回值

序号类型说明
r1string目录部分(带结尾分隔符)
r2string文件名部分

示例

dir, name = file.Split("/usr/bin/bash")
println(dir) // OUT: /usr/bin/
println(name) // OUT: bash
assert dir == "/usr/bin/", "Split should return the directory part"
assert name == "bash", "Split should return the file name part"

Stat

Stat(name string) (os.FileInfo, error)

返回一个文件的信息和错误

参数

参数名类型说明
namestring待查询的文件路径

返回值

序号类型说明
r1os.FileInfo文件信息对象
r2error错误信息

示例

// 关键词: file.Stat, 获取文件信息
p = file.Join(os.TempDir(), "yak-stat-demo.txt")
file.Save(p, "hello yak")~ // body 共 9 字节
info = file.Stat(p)~
println("name:", info.Name(), "size:", info.Size(), "isDir:", info.IsDir())
assert info.Size() == 9, "size should be 9 bytes"
assert !info.IsDir(), "should be a file, not a dir"
file.Remove(p)

TailF

TailF(i string, line func(i string))

模拟 unix 命令 tail -f,执行这个函数会一直阻塞,监听文件内容变化,如果文件有变化,会自动通过回调通知新的内容

参数

参数名类型说明
istring待监听的文件路径
linefunc(i string)每读取到新行时调用的回调函数,参数为该行内容

示例

// 无法本地验证: TailF 会持续阻塞监听文件变化, 不适合在示例中同步执行
file.TailF("/tmp/test.txt", func(line) { println(line) }) // 类似 tail -f, 有新行就回调

Walk

Walk(uPath string, i func(info *utils.FileInfo) bool) error

遍历一个目录下的所有文件和目录,对每一项调用回调函数,返回错误

参数

参数名类型说明
uPathstring待遍历的目录路径
ifunc(info *utils.FileInfo) bool对每个文件/目录调用的回调函数,返回 true 继续遍历

返回值

序号类型说明
r1error错误信息

示例

file.Walk("/tmp", func(info) {println(info.Name); return true})~

可变参数函数详情

Join

Join(path ...string) string

将任意数量的路径以默认路径分隔符链接在一起

可选参数

参数名类型说明
path...string任意数量的路径片段

返回值

序号类型说明
r1string用默认分隔符拼接后的路径

示例

p = file.Join("/usr", "bin", "bash")
println(p) // OUT: /usr/bin/bash
assert p == "/usr/bin/bash", "Join should join path segments with separator"

NewMultiFileLineReader

NewMultiFileLineReader(files ...string) (*mfreader.MultiFileLineReader, error)

创建一个多文件读取器,返回一个多文件读取器结构体引用和错误

可选参数

参数名类型说明
files...string一个或多个待读取的文件路径

返回值

序号类型说明
r1*mfreader.MultiFileLineReader多文件读取器结构体引用
r2error错误信息

示例

// 关键词: file.NewMultiFileLineReader, 多文件逐行读取
f1 = file.Join(os.TempDir(), "yak-mfr-1.txt")
f2 = file.Join(os.TempDir(), "yak-mfr-2.txt")
file.Save(f1, "123")~ // 第一个文件
file.Save(f2, "456")~ // 第二个文件
m = file.NewMultiFileLineReader(f1, f2)~ // 跨多个文件连续按行读取
lines = []
for m.Next() {
lines = append(lines, m.Text()) // 依次读到 "123" 和 "456"
}
println("lines:", lines)
assert len(lines) == 2, "should read 2 lines across 2 files"
file.Remove(f1); file.Remove(f2)

TempFile

TempFile(dirPart ...string) (*_yakFile, error)

创建一个临时文件,返回一个文件结构体引用与错误

可选参数

参数名类型说明
dirPart...string可选的临时文件所在目录,不传则使用默认临时目录

返回值

序号类型说明
r1*_yakFile临时文件结构体引用
r2error错误信息

示例

f, err = file.TempFile()
die(err)
defer f.Close()
f.WriteString("hello yak")

TempFileName

TempFileName(pattern ...string) (string, error)

创建一个临时文件,返回一个文件名与错误

可选参数

参数名类型说明
pattern...string可选的文件名匹配模式(如 "pattern-*.txt")

返回值

序号类型说明
r1string创建的临时文件名
r2error错误信息

示例

name, err = file.TempFileName()
die(err)
defer os.Remove(name)
file.Save(name, "hello yak")

name, err = file.TempFileName("pattern-*.txt")

if die(err) {
return
}

defer os.Remove(name)
file.Save(name, "hello yak")