diff --git a/kernel/filesys/tree.go b/kernel/filesys/tree.go index 3e06492e5..64f453250 100644 --- a/kernel/filesys/tree.go +++ b/kernel/filesys/tree.go @@ -82,11 +82,13 @@ func LoadTreeByData(data []byte, boxID, p string, luteEngine *lute.Lute) (ret *p parentData, readErr := filelock.ReadFile(parentAbsPath) if nil != readErr { if os.IsNotExist(readErr) { + // 子文档缺失父文档时自动补全 https://github.com/siyuan-note/siyuan/issues/7376 parentTree := treenode.NewTree(boxID, parentPath, hPathBuilder.String()+"Untitled", "Untitled") if writeErr := WriteTree(parentTree); nil != writeErr { logging.LogErrorf("rebuild parent tree [%s] failed: %s", parentAbsPath, writeErr) } else { logging.LogInfof("rebuilt parent tree [%s]", parentAbsPath) + treenode.IndexBlockTree(parentTree) } } else { logging.LogWarnf("read parent tree data [%s] failed: %s", parentAbsPath, readErr) diff --git a/kernel/model/index_fix.go b/kernel/model/index_fix.go index e7b742738..cd4d08ca9 100644 --- a/kernel/model/index_fix.go +++ b/kernel/model/index_fix.go @@ -128,9 +128,26 @@ func resetDuplicateBlocksOnFileSys() { boxPath := filepath.Join(util.DataDir, box.ID) filepath.Walk(boxPath, func(path string, info os.FileInfo, err error) error { if info.IsDir() { + if boxPath == path { + // 跳过根路径(笔记本文件夹) + return nil + } + if strings.HasPrefix(info.Name(), ".") { return filepath.SkipDir } + + if !ast.IsNodeIDPattern(info.Name()) { + return nil + } + + if util.IsEmptyDir(filepath.Join(path)) { + // 删除空的子文档文件夹 + if removeErr := os.RemoveAll(path); nil != removeErr { + logging.LogErrorf("remove empty folder failed: %s", removeErr) + } + return nil + } return nil } @@ -234,6 +251,11 @@ func fixBlockTreeByFileSys() { boxPath := filepath.Join(util.DataDir, box.ID) var paths []string filepath.Walk(boxPath, func(path string, info os.FileInfo, err error) error { + if boxPath == path { + // 跳过根路径(笔记本文件夹) + return nil + } + if info.IsDir() { if strings.HasPrefix(info.Name(), ".") { return filepath.SkipDir