From f05f56b3e802114249271ddb07f096ce7bcd3d7c Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Mon, 29 Sep 2025 11:27:00 +0800 Subject: [PATCH] :art: Prompt when the user attempts to create a workspace in the root directory of the disk https://github.com/siyuan-note/siyuan/issues/15976 Signed-off-by: Daniel <845765@qq.com> --- app/appearance/langs/ar_SA.json | 4 ++- app/appearance/langs/de_DE.json | 4 ++- app/appearance/langs/en_US.json | 4 ++- app/appearance/langs/es_ES.json | 4 ++- app/appearance/langs/fr_FR.json | 4 ++- app/appearance/langs/he_IL.json | 4 ++- app/appearance/langs/it_IT.json | 4 ++- app/appearance/langs/ja_JP.json | 4 ++- app/appearance/langs/pl_PL.json | 4 ++- app/appearance/langs/pt_BR.json | 4 ++- app/appearance/langs/ru_RU.json | 4 ++- app/appearance/langs/zh_CHT.json | 4 ++- app/appearance/langs/zh_CN.json | 4 ++- kernel/api/workspace.go | 50 +++++++++++++++----------------- kernel/util/path.go | 4 +-- 15 files changed, 65 insertions(+), 41 deletions(-) diff --git a/app/appearance/langs/ar_SA.json b/app/appearance/langs/ar_SA.json index f96eadf05..7dbf2e7f7 100644 --- a/app/appearance/langs/ar_SA.json +++ b/app/appearance/langs/ar_SA.json @@ -1671,6 +1671,8 @@ "269": "تمت إضافة هذا المقطع بالفعل إلى قاعدة البيانات ‎[%s]‎", "270": "يتم تحسين فهرس البيانات، يرجى الانتظار...", "271": "اكتملت عملية تحسين فهرس البيانات، تم تحرير [%s] من مساحة القرص", - "272": "حقل غير مسمى" + "272": "حقل غير مسمى", + "273": "لا تقم بإنشاء مساحة العمل في مسار جذر القسم، يرجى إنشاء مجلد جديد كمساحة عمل", + "274": "يحتوي هذا المجلد على ملفات أخرى، يرجى إنشاء مجلد جديد كمساحة عمل" } } diff --git a/app/appearance/langs/de_DE.json b/app/appearance/langs/de_DE.json index 3ca3f609d..d7d442eb1 100644 --- a/app/appearance/langs/de_DE.json +++ b/app/appearance/langs/de_DE.json @@ -1671,6 +1671,8 @@ "269": "Dieser Block wurde bereits zur Datenbank [%s] hinzugefügt", "270": "Datenindex wird optimiert, bitte warten...", "271": "Datenindex-Optimierung abgeschlossen, [%s] Speicherplatz freigegeben", - "272": "Unbenanntes Feld" + "272": "Unbenanntes Feld", + "273": "Erstellen Sie den Arbeitsbereich nicht im Stammverzeichnis der Partition, erstellen Sie bitte einen neuen Ordner als Arbeitsbereich", + "274": "Dieser Ordner enthält andere Dateien, erstellen Sie bitte einen neuen Ordner als Arbeitsbereich" } } diff --git a/app/appearance/langs/en_US.json b/app/appearance/langs/en_US.json index c8551366f..af690d992 100644 --- a/app/appearance/langs/en_US.json +++ b/app/appearance/langs/en_US.json @@ -1671,6 +1671,8 @@ "269": "This block has already been added to the database [%s]", "270": "Optimizing data index, please wait...", "271": "Data index optimization completed, [%s] disk space freed", - "272": "Unnamed field" + "272": "Unnamed field", + "273": "Do not create the workspace in the partition root path, please create a new folder as the workspace", + "274": "This folder contains other files, please create a new folder as the workspace" } } diff --git a/app/appearance/langs/es_ES.json b/app/appearance/langs/es_ES.json index 4d3ce65e1..c91ac92e8 100644 --- a/app/appearance/langs/es_ES.json +++ b/app/appearance/langs/es_ES.json @@ -1671,6 +1671,8 @@ "269": "Este bloque ya ha sido añadido a la base de datos [%s]", "270": "Optimizando el índice de datos, por favor espere...", "271": "Optimización del índice de datos completada, se liberaron [%s] de espacio en disco", - "272": "Campo sin nombre" + "272": "Campo sin nombre", + "273": "No cree el espacio de trabajo en la ruta raíz de la partición, cree una nueva carpeta como espacio de trabajo", + "274": "Esta carpeta contiene otros archivos, cree una nueva carpeta como espacio de trabajo" } } diff --git a/app/appearance/langs/fr_FR.json b/app/appearance/langs/fr_FR.json index 578c122d2..35cf3cb8d 100644 --- a/app/appearance/langs/fr_FR.json +++ b/app/appearance/langs/fr_FR.json @@ -1671,6 +1671,8 @@ "269": "Ce bloc a déjà été ajouté à la base de données [%s]", "270": "Optimisation de l'index des données en cours, veuillez patienter...", "271": "Optimisation de l'index des données terminée, [%s] d'espace disque libéré", - "272": "Champ sans nom" + "272": "Champ sans nom", + "273": "Ne créez pas l’espace de travail à la racine de la partition, créez un nouveau dossier comme espace de travail", + "274": "Ce dossier contient d’autres fichiers, créez un nouveau dossier comme espace de travail" } } diff --git a/app/appearance/langs/he_IL.json b/app/appearance/langs/he_IL.json index 8ab33e8a2..89f61b76e 100644 --- a/app/appearance/langs/he_IL.json +++ b/app/appearance/langs/he_IL.json @@ -1671,6 +1671,8 @@ "269": "הבלוק נוסף כבר למסד הנתונים ‎[%s]‎", "270": "מתבצעת אופטימיזציה של אינדקס הנתונים, נא להמתין...", "271": "אופטימיזציית אינדקס הנתונים הושלמה, שוחררו [%s] שטח דיסק", - "272": "שדה ללא שם" + "272": "שדה ללא שם", + "273": "אל תיצור סביבת עבודה בנתיב השורש של המחיצה, צור תיקיה חדשה כסביבת עבודה", + "274": "התיקיה הזו מכילה קבצים נוספים, צור תיקיה חדשה כסביבת עבודה" } } diff --git a/app/appearance/langs/it_IT.json b/app/appearance/langs/it_IT.json index 3ad83f789..adca336c5 100644 --- a/app/appearance/langs/it_IT.json +++ b/app/appearance/langs/it_IT.json @@ -1671,6 +1671,8 @@ "269": "Questo blocco è già stato aggiunto al database [%s]", "270": "Ottimizzazione dell'indice dei dati in corso, attendere prego...", "271": "Ottimizzazione dell'indice dei dati completata, liberati [%s] di spazio su disco", - "272": "Campo senza nome" + "272": "Campo senza nome", + "273": "Non creare lo spazio di lavoro nella directory radice della partizione, crea una nuova cartella come spazio di lavoro", + "274": "Questa cartella contiene altri file, crea una nuova cartella come spazio di lavoro" } } diff --git a/app/appearance/langs/ja_JP.json b/app/appearance/langs/ja_JP.json index a81866cf4..6354c25ba 100644 --- a/app/appearance/langs/ja_JP.json +++ b/app/appearance/langs/ja_JP.json @@ -1671,6 +1671,8 @@ "269": "このブロックはすでにデータベース [%s] に追加されています", "270": "データインデックスを最適化しています。しばらくお待ちください...", "271": "データインデックスの最適化が完了しました。合計 [%s] のディスク容量が解放されました", - "272": "未命名フィールド" + "272": "未命名フィールド", + "273": "パーティションのルートパスにワークスペースを作成しないでください。新しいフォルダーをワークスペースとして作成してください", + "274": "このフォルダーには他のファイルが含まれています。新しいフォルダーをワークスペースとして作成してください" } } diff --git a/app/appearance/langs/pl_PL.json b/app/appearance/langs/pl_PL.json index 8e7496949..39f6f0d9e 100644 --- a/app/appearance/langs/pl_PL.json +++ b/app/appearance/langs/pl_PL.json @@ -1671,6 +1671,8 @@ "269": "Ten blok został już dodany do bazy danych [%s]", "270": "Optymalizacja indeksu danych, proszę czekać...", "271": "Optymalizacja indeksu danych zakończona, zwolniono [%s] miejsca na dysku", - "272": "Nienazwane pole" + "272": "Nienazwane pole", + "273": "Nie twórz przestrzeni roboczej w katalogu głównym partycji, utwórz nowy folder jako przestrzeń roboczą", + "274": "Ten folder zawiera inne pliki, utwórz nowy folder jako przestrzeń roboczą" } } diff --git a/app/appearance/langs/pt_BR.json b/app/appearance/langs/pt_BR.json index 663009ae6..cbd17e1ba 100644 --- a/app/appearance/langs/pt_BR.json +++ b/app/appearance/langs/pt_BR.json @@ -1671,6 +1671,8 @@ "269": "Este bloco já foi adicionado ao banco de dados [%s]", "270": "Otimizando o índice de dados, por favor aguarde...", "271": "Otimização do índice de dados concluída, [%s] de espaço liberado", - "272": "Campo sem nome" + "272": "Campo sem nome", + "273": "Não crie o espaço de trabalho na raiz da partição, crie uma nova pasta para o espaço de trabalho", + "274": "Esta pasta contém outros arquivos, crie uma nova pasta para o espaço de trabalho" } } diff --git a/app/appearance/langs/ru_RU.json b/app/appearance/langs/ru_RU.json index ca6c44ba7..2883e0a7c 100644 --- a/app/appearance/langs/ru_RU.json +++ b/app/appearance/langs/ru_RU.json @@ -1671,6 +1671,8 @@ "269": "Этот блок уже добавлен в базу данных [%s]", "270": "Оптимизация индекса данных, пожалуйста, подождите...", "271": "Оптимизация индекса данных завершена, освобождено [%s] дискового пространства", - "272": "Неименованное поле" + "272": "Неименованное поле", + "273": "Не создавайте рабочее пространство в корневом каталоге раздела, создайте отдельную папку для рабочего пространства", + "274": "Эта папка содержит другие файлы, создайте отдельную папку для рабочего пространства" } } diff --git a/app/appearance/langs/zh_CHT.json b/app/appearance/langs/zh_CHT.json index 23cc6c2b2..33045ca70 100644 --- a/app/appearance/langs/zh_CHT.json +++ b/app/appearance/langs/zh_CHT.json @@ -1671,6 +1671,8 @@ "269": "該塊已經添加到資料庫 [%s] 中", "270": "正在優化資料索引,請稍等...", "271": "資料索引優化完畢,共釋放 [%s] 磁碟空間", - "272": "未命名欄位" + "272": "未命名欄位", + "273": "請勿在分區根路徑上建立工作空間,請新建一個資料夾作為工作空間", + "274": "該資料夾包含其他檔案,請新建一個資料夾作為工作空間" } } diff --git a/app/appearance/langs/zh_CN.json b/app/appearance/langs/zh_CN.json index a6193322f..4b8bba30f 100644 --- a/app/appearance/langs/zh_CN.json +++ b/app/appearance/langs/zh_CN.json @@ -1671,6 +1671,8 @@ "269": "该块已经添加到数据库 [%s] 中", "270": "正在优化数据索引,请稍等...", "271": "数据索引优化完毕,共释放 [%s] 磁盘空间", - "272": "未命名字段" + "272": "未命名字段", + "273": "请勿在分区根路径上创建工作空间,请新建一个文件夹作为工作空间", + "274": "该文件夹包含了其他文件,请新建一个文件夹作为工作空间" } } diff --git a/kernel/api/workspace.go b/kernel/api/workspace.go index 34a75fd0d..81d0318e9 100644 --- a/kernel/api/workspace.go +++ b/kernel/api/workspace.go @@ -43,6 +43,28 @@ func checkWorkspaceDir(c *gin.Context) { } path := arg["path"].(string) + // 检查路径是否是分区根路径 + if util.IsPartitionRootPath(path) { + ret.Code = -1 + ret.Msg = model.Conf.Language(273) + ret.Data = map[string]interface{}{"closeTimeout": 7000} + return + } + + // 检查路径是否包含其他文件 + entries, err := os.ReadDir(path) + if err != nil { + ret.Code = -1 + ret.Msg = fmt.Sprintf("read dir [%s] failed: %s", path, err) + return + } + if 0 < len(entries) { + ret.Code = -1 + ret.Msg = model.Conf.Language(274) + ret.Data = map[string]interface{}{"closeTimeout": 7000} + return + } + if isInvalidWorkspacePath(path) { ret.Code = -1 ret.Msg = "This workspace name is not allowed, please use another name" @@ -55,32 +77,8 @@ func checkWorkspaceDir(c *gin.Context) { return } - entries, err := os.ReadDir(path) - if err != nil { - ret.Code = -1 - ret.Msg = fmt.Sprintf("read workspace dir [%s] failed: %s", path, err) - } - - var existsConf, existsData bool - for _, entry := range entries { - if !existsConf { - existsConf = "conf" == entry.Name() && entry.IsDir() - } - if !existsData { - existsData = "data" == entry.Name() && entry.IsDir() - } - - if existsConf && existsData { - break - } - } - - if existsConf { - existsConf = gulu.File.IsExist(filepath.Join(path, "conf", "conf.json")) - } - ret.Data = map[string]interface{}{ - "isWorkspace": existsConf && existsData, + "isWorkspace": util.IsWorkspaceDir(path), } } @@ -300,7 +298,7 @@ func setWorkspaceDir(c *gin.Context) { // 检查路径是否在已有的工作空间路径中 pathIsWorkspace := util.IsWorkspaceDir(path) if !pathIsWorkspace { - for p := filepath.Dir(path); !util.IsRootPath(p); p = filepath.Dir(p) { + for p := filepath.Dir(path); !util.IsPartitionRootPath(p); p = filepath.Dir(p) { if util.IsWorkspaceDir(p) { ret.Code = -1 ret.Msg = fmt.Sprintf(model.Conf.Language(256), path, p) diff --git a/kernel/util/path.go b/kernel/util/path.go index 5f382934f..87a35604e 100644 --- a/kernel/util/path.go +++ b/kernel/util/path.go @@ -383,8 +383,8 @@ func IsWorkspaceDir(dir string) bool { return strings.Contains(string(data), "kernelVersion") } -// IsRootPath checks if the given path is a root path. -func IsRootPath(path string) bool { +// IsPartitionRootPath checks if the given path is a partition root path. +func IsPartitionRootPath(path string) bool { if path == "" { return false }