| | |
| | | if strings.HasPrefix(info.Name(), ".") && info.Name() != "." { |
| | | return filepath.SkipDir |
| | | } |
| | | // 跳过待审阅目录 |
| | | if info.Name() == "待审阅" { |
| | | return filepath.SkipDir |
| | | } |
| | | return nil |
| | | } |
| | | if !strings.HasSuffix(path, ".md") { |
| | |
| | | |
| | | 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 |
| | | } |