package vault
|
|
import (
|
"os"
|
"path/filepath"
|
"strings"
|
)
|
|
// ScanVault 扫描知识库目录,返回所有 markdown 文件的元数据
|
func ScanVault(vaultPath string) ([]*FileMeta, error) {
|
var files []*FileMeta
|
|
err := filepath.Walk(vaultPath, func(path string, info os.FileInfo, err error) error {
|
if err != nil {
|
return nil // 跳过错误文件
|
}
|
if info.IsDir() {
|
// 跳过隐藏目录
|
if strings.HasPrefix(info.Name(), ".") && info.Name() != "." {
|
return filepath.SkipDir
|
}
|
// 跳过待审阅目录
|
if info.Name() == "待审阅" {
|
return filepath.SkipDir
|
}
|
return nil
|
}
|
if !strings.HasSuffix(path, ".md") {
|
return nil
|
}
|
|
relPath, _ := filepath.Rel(vaultPath, path)
|
meta, err := ParseFile(path, relPath)
|
if err != nil {
|
return nil // 跳过解析失败的文件
|
}
|
files = append(files, meta)
|
return nil
|
})
|
|
return files, err
|
}
|
|
// FileStat 文件指纹(只 stat,不读内容)
|
type FileStat struct {
|
Path string // 相对路径
|
Size int64
|
Mtime int64 // Unix 秒
|
}
|
|
// ScanVaultStat 扫描 .md 文件指纹清单(跳过隐藏目录和待审阅目录,与 ScanVault 一致)
|
func ScanVaultStat(vaultPath string) ([]FileStat, error) {
|
var stats []FileStat
|
err := filepath.Walk(vaultPath, func(path string, info os.FileInfo, err error) error {
|
if err != nil {
|
return nil
|
}
|
if info.IsDir() {
|
if strings.HasPrefix(info.Name(), ".") && info.Name() != "." {
|
return filepath.SkipDir
|
}
|
if info.Name() == "待审阅" {
|
return filepath.SkipDir
|
}
|
return nil
|
}
|
if !strings.HasSuffix(path, ".md") {
|
return nil
|
}
|
relPath, _ := filepath.Rel(vaultPath, path)
|
stats = append(stats, FileStat{
|
Path: relPath,
|
Size: info.Size(),
|
Mtime: info.ModTime().Unix(),
|
})
|
return nil
|
})
|
return stats, err
|
}
|