mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2025-12-19 06:30:10 +08:00
fix: 修复跨平台恢复场景下的笔记目录验证和默认路径重置逻辑 (#11950)
* fix: 修复跨平台恢复场景下的笔记目录验证和默认路径重置逻辑 * fix: 优化跨平台恢复场景下的笔记目录验证逻辑,跳过默认路径的验证
This commit is contained in:
parent
432b31c7b1
commit
784fdd4fed
@ -163,7 +163,7 @@ class FileStorage {
|
|||||||
fs.mkdirSync(this.storageDir, { recursive: true })
|
fs.mkdirSync(this.storageDir, { recursive: true })
|
||||||
}
|
}
|
||||||
if (!fs.existsSync(this.notesDir)) {
|
if (!fs.existsSync(this.notesDir)) {
|
||||||
fs.mkdirSync(this.storageDir, { recursive: true })
|
fs.mkdirSync(this.notesDir, { recursive: true })
|
||||||
}
|
}
|
||||||
if (!fs.existsSync(this.tempDir)) {
|
if (!fs.existsSync(this.tempDir)) {
|
||||||
fs.mkdirSync(this.tempDir, { recursive: true })
|
fs.mkdirSync(this.tempDir, { recursive: true })
|
||||||
|
|||||||
@ -2152,6 +2152,7 @@
|
|||||||
"collapse": "Collapse",
|
"collapse": "Collapse",
|
||||||
"content_placeholder": "Please enter the note content...",
|
"content_placeholder": "Please enter the note content...",
|
||||||
"copyContent": "Copy Content",
|
"copyContent": "Copy Content",
|
||||||
|
"crossPlatformRestoreWarning": "Cross-platform configuration restored, but notes directory is empty. Please copy your note files to: {{path}}",
|
||||||
"delete": "delete",
|
"delete": "delete",
|
||||||
"delete_confirm": "Are you sure you want to delete this {{type}}?",
|
"delete_confirm": "Are you sure you want to delete this {{type}}?",
|
||||||
"delete_folder_confirm": "Are you sure you want to delete the folder \"{{name}}\" and all of its contents?",
|
"delete_folder_confirm": "Are you sure you want to delete the folder \"{{name}}\" and all of its contents?",
|
||||||
|
|||||||
@ -2152,6 +2152,7 @@
|
|||||||
"collapse": "收起",
|
"collapse": "收起",
|
||||||
"content_placeholder": "请输入笔记内容...",
|
"content_placeholder": "请输入笔记内容...",
|
||||||
"copyContent": "复制内容",
|
"copyContent": "复制内容",
|
||||||
|
"crossPlatformRestoreWarning": "检测到从其他设备恢复配置,但笔记目录为空。请将笔记文件复制到: {{path}}",
|
||||||
"delete": "删除",
|
"delete": "删除",
|
||||||
"delete_confirm": "确定要删除这个{{type}}吗?",
|
"delete_confirm": "确定要删除这个{{type}}吗?",
|
||||||
"delete_folder_confirm": "确定要删除文件夹 \"{{name}}\" 及其所有内容吗?",
|
"delete_folder_confirm": "确定要删除文件夹 \"{{name}}\" 及其所有内容吗?",
|
||||||
|
|||||||
@ -2152,6 +2152,7 @@
|
|||||||
"collapse": "收合",
|
"collapse": "收合",
|
||||||
"content_placeholder": "請輸入筆記內容...",
|
"content_placeholder": "請輸入筆記內容...",
|
||||||
"copyContent": "複製內容",
|
"copyContent": "複製內容",
|
||||||
|
"crossPlatformRestoreWarning": "偵測到從其他裝置恢復設定,但筆記目錄為空。請將筆記檔案複製到:{{path}}",
|
||||||
"delete": "刪除",
|
"delete": "刪除",
|
||||||
"delete_confirm": "確定要刪除此 {{type}} 嗎?",
|
"delete_confirm": "確定要刪除此 {{type}} 嗎?",
|
||||||
"delete_folder_confirm": "確定要刪除資料夾 \"{{name}}\" 及其所有內容嗎?",
|
"delete_folder_confirm": "確定要刪除資料夾 \"{{name}}\" 及其所有內容嗎?",
|
||||||
|
|||||||
@ -2152,6 +2152,7 @@
|
|||||||
"collapse": "Einklappen",
|
"collapse": "Einklappen",
|
||||||
"content_placeholder": "Bitte Notizinhalt eingeben...",
|
"content_placeholder": "Bitte Notizinhalt eingeben...",
|
||||||
"copyContent": "Inhalt kopieren",
|
"copyContent": "Inhalt kopieren",
|
||||||
|
"crossPlatformRestoreWarning": "[to be translated]:Cross-platform configuration restored, but notes directory is empty. Please copy your note files to: {{path}}",
|
||||||
"delete": "Löschen",
|
"delete": "Löschen",
|
||||||
"delete_confirm": "Möchten Sie diesen {{type}} wirklich löschen?",
|
"delete_confirm": "Möchten Sie diesen {{type}} wirklich löschen?",
|
||||||
"delete_folder_confirm": "Möchten Sie Ordner \"{{name}}\" und alle seine Inhalte wirklich löschen?",
|
"delete_folder_confirm": "Möchten Sie Ordner \"{{name}}\" und alle seine Inhalte wirklich löschen?",
|
||||||
|
|||||||
@ -2152,6 +2152,7 @@
|
|||||||
"collapse": "σύμπτυξη",
|
"collapse": "σύμπτυξη",
|
||||||
"content_placeholder": "Παρακαλώ εισαγάγετε το περιεχόμενο των σημειώσεων...",
|
"content_placeholder": "Παρακαλώ εισαγάγετε το περιεχόμενο των σημειώσεων...",
|
||||||
"copyContent": "αντιγραφή περιεχομένου",
|
"copyContent": "αντιγραφή περιεχομένου",
|
||||||
|
"crossPlatformRestoreWarning": "[to be translated]:Cross-platform configuration restored, but notes directory is empty. Please copy your note files to: {{path}}",
|
||||||
"delete": "διαγραφή",
|
"delete": "διαγραφή",
|
||||||
"delete_confirm": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το {{type}};",
|
"delete_confirm": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το {{type}};",
|
||||||
"delete_folder_confirm": "Θέλετε να διαγράψετε τον φάκελο «{{name}}» και όλο το περιεχόμενό του;",
|
"delete_folder_confirm": "Θέλετε να διαγράψετε τον φάκελο «{{name}}» και όλο το περιεχόμενό του;",
|
||||||
|
|||||||
@ -2152,6 +2152,7 @@
|
|||||||
"collapse": "ocultar",
|
"collapse": "ocultar",
|
||||||
"content_placeholder": "Introduzca el contenido de la nota...",
|
"content_placeholder": "Introduzca el contenido de la nota...",
|
||||||
"copyContent": "copiar contenido",
|
"copyContent": "copiar contenido",
|
||||||
|
"crossPlatformRestoreWarning": "[to be translated]:Cross-platform configuration restored, but notes directory is empty. Please copy your note files to: {{path}}",
|
||||||
"delete": "eliminar",
|
"delete": "eliminar",
|
||||||
"delete_confirm": "¿Estás seguro de que deseas eliminar este {{type}}?",
|
"delete_confirm": "¿Estás seguro de que deseas eliminar este {{type}}?",
|
||||||
"delete_folder_confirm": "¿Está seguro de que desea eliminar la carpeta \"{{name}}\" y todo su contenido?",
|
"delete_folder_confirm": "¿Está seguro de que desea eliminar la carpeta \"{{name}}\" y todo su contenido?",
|
||||||
|
|||||||
@ -2152,6 +2152,7 @@
|
|||||||
"collapse": "réduire",
|
"collapse": "réduire",
|
||||||
"content_placeholder": "Veuillez saisir le contenu de la note...",
|
"content_placeholder": "Veuillez saisir le contenu de la note...",
|
||||||
"copyContent": "contenu copié",
|
"copyContent": "contenu copié",
|
||||||
|
"crossPlatformRestoreWarning": "[to be translated]:Cross-platform configuration restored, but notes directory is empty. Please copy your note files to: {{path}}",
|
||||||
"delete": "supprimer",
|
"delete": "supprimer",
|
||||||
"delete_confirm": "Êtes-vous sûr de vouloir supprimer ce {{type}} ?",
|
"delete_confirm": "Êtes-vous sûr de vouloir supprimer ce {{type}} ?",
|
||||||
"delete_folder_confirm": "Êtes-vous sûr de vouloir supprimer le dossier \"{{name}}\" et tout son contenu ?",
|
"delete_folder_confirm": "Êtes-vous sûr de vouloir supprimer le dossier \"{{name}}\" et tout son contenu ?",
|
||||||
|
|||||||
@ -2152,6 +2152,7 @@
|
|||||||
"collapse": "閉じる",
|
"collapse": "閉じる",
|
||||||
"content_placeholder": "メモの内容を入力してください...",
|
"content_placeholder": "メモの内容を入力してください...",
|
||||||
"copyContent": "コンテンツをコピーします",
|
"copyContent": "コンテンツをコピーします",
|
||||||
|
"crossPlatformRestoreWarning": "[to be translated]:Cross-platform configuration restored, but notes directory is empty. Please copy your note files to: {{path}}",
|
||||||
"delete": "削除",
|
"delete": "削除",
|
||||||
"delete_confirm": "この{{type}}を本当に削除しますか?",
|
"delete_confirm": "この{{type}}を本当に削除しますか?",
|
||||||
"delete_folder_confirm": "「{{name}}」フォルダーとそのすべての内容を削除してもよろしいですか?",
|
"delete_folder_confirm": "「{{name}}」フォルダーとそのすべての内容を削除してもよろしいですか?",
|
||||||
|
|||||||
@ -2152,6 +2152,7 @@
|
|||||||
"collapse": "[minimizar]",
|
"collapse": "[minimizar]",
|
||||||
"content_placeholder": "Introduza o conteúdo da nota...",
|
"content_placeholder": "Introduza o conteúdo da nota...",
|
||||||
"copyContent": "copiar conteúdo",
|
"copyContent": "copiar conteúdo",
|
||||||
|
"crossPlatformRestoreWarning": "[to be translated]:Cross-platform configuration restored, but notes directory is empty. Please copy your note files to: {{path}}",
|
||||||
"delete": "eliminar",
|
"delete": "eliminar",
|
||||||
"delete_confirm": "Tem a certeza de que deseja eliminar este {{type}}?",
|
"delete_confirm": "Tem a certeza de que deseja eliminar este {{type}}?",
|
||||||
"delete_folder_confirm": "Tem a certeza de que deseja eliminar a pasta \"{{name}}\" e todos os seus conteúdos?",
|
"delete_folder_confirm": "Tem a certeza de que deseja eliminar a pasta \"{{name}}\" e todos os seus conteúdos?",
|
||||||
|
|||||||
@ -2152,6 +2152,7 @@
|
|||||||
"collapse": "Свернуть",
|
"collapse": "Свернуть",
|
||||||
"content_placeholder": "Введите содержимое заметки...",
|
"content_placeholder": "Введите содержимое заметки...",
|
||||||
"copyContent": "Копировать контент",
|
"copyContent": "Копировать контент",
|
||||||
|
"crossPlatformRestoreWarning": "[to be translated]:Cross-platform configuration restored, but notes directory is empty. Please copy your note files to: {{path}}",
|
||||||
"delete": "удалить",
|
"delete": "удалить",
|
||||||
"delete_confirm": "Вы уверены, что хотите удалить этот объект {{type}}?",
|
"delete_confirm": "Вы уверены, что хотите удалить этот объект {{type}}?",
|
||||||
"delete_folder_confirm": "Вы уверены, что хотите удалить папку \"{{name}}\" со всем ее содержимым?",
|
"delete_folder_confirm": "Вы уверены, что хотите удалить папку \"{{name}}\" со всем ее содержимым?",
|
||||||
|
|||||||
@ -39,6 +39,7 @@ import {
|
|||||||
} from '@renderer/store/note'
|
} from '@renderer/store/note'
|
||||||
import type { NotesSortType, NotesTreeNode } from '@renderer/types/note'
|
import type { NotesSortType, NotesTreeNode } from '@renderer/types/note'
|
||||||
import type { FileChangeEvent } from '@shared/config/types'
|
import type { FileChangeEvent } from '@shared/config/types'
|
||||||
|
import { message } from 'antd'
|
||||||
import { debounce } from 'lodash'
|
import { debounce } from 'lodash'
|
||||||
import { AnimatePresence, motion } from 'motion/react'
|
import { AnimatePresence, motion } from 'motion/react'
|
||||||
import type { FC } from 'react'
|
import type { FC } from 'react'
|
||||||
@ -246,6 +247,43 @@ const NotesPage: FC = () => {
|
|||||||
updateNotesPath(defaultPath)
|
updateNotesPath(defaultPath)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 验证路径是否有效(处理跨平台恢复场景)
|
||||||
|
try {
|
||||||
|
// 获取当前平台的默认路径
|
||||||
|
const info = await window.api.getAppInfo()
|
||||||
|
const defaultPath = info.notesPath
|
||||||
|
|
||||||
|
// 如果当前路径就是默认路径,跳过验证(默认路径始终有效)
|
||||||
|
if (notesPath === defaultPath) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const isValid = await window.api.file.validateNotesDirectory(notesPath)
|
||||||
|
if (!isValid) {
|
||||||
|
logger.warn('Invalid notes path detected, resetting to default', { path: notesPath })
|
||||||
|
|
||||||
|
// 重置为默认路径
|
||||||
|
updateNotesPath(defaultPath)
|
||||||
|
|
||||||
|
// 检查默认路径下是否有笔记文件
|
||||||
|
try {
|
||||||
|
const tree = await window.api.file.getDirectoryStructure(defaultPath)
|
||||||
|
if (!tree || tree.length === 0) {
|
||||||
|
// 默认目录为空,提示用户需要迁移文件
|
||||||
|
message.warning({
|
||||||
|
content: t('notes.crossPlatformRestoreWarning', { path: defaultPath }),
|
||||||
|
duration: 10
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
// 目录不存在或读取失败,会由 FileStorage 自动创建
|
||||||
|
logger.debug('Default notes directory will be created', { error })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
logger.error('Failed to validate notes path:', error as Error)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
initialize()
|
initialize()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user