{"record":{"id":"6648c35a72abe794","repo":"siyuan-note/siyuan","slug":"conf-language-14","errorCode":null,"errorMessage":"Conf.Language(14)","messagePattern":"Conf\\.Language\\(14\\)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"kernel/model/export.go","lineNumber":792,"sourceCode":"\nfunc exportData(exportFolder string) (zipPath string, err error) {\n\tFlushTxQueue()\n\tif err = EnsureAllSyncAssets(); err != nil {\n\t\treturn\n\t}\n\n\tlogging.LogInfof(\"exporting data...\")\n\n\tbaseFolderName := \"data-\" + util.CurrentTimeSecondsStr()\n\tif err = os.MkdirAll(exportFolder, 0755); err != nil {\n\t\tlogging.LogErrorf(\"create export temp folder failed: %s\", err)\n\t\treturn\n\t}\n\n\tdata := filepath.Join(util.WorkspaceDir, \"data\")\n\tif err = filelock.Copy(data, exportFolder); err != nil {\n\t\tlogging.LogErrorf(\"copy data dir from [%s] to [%s] failed: %s\", data, baseFolderName, err)\n\t\terr = fmt.Errorf(Conf.Language(14), err.Error())\n\t\treturn\n\t}\n\n\tzipPath = exportFolder + \".zip\"\n\tzip, err := gulu.Zip.Create(zipPath)\n\tif err != nil {\n\t\tlogging.LogErrorf(\"create export data zip [%s] failed: %s\", exportFolder, err)\n\t\treturn\n\t}\n\n\tzipCallback := func(filename string) {\n\t\tutil.PushEndlessProgress(Conf.language(65) + \" \" + fmt.Sprintf(Conf.language(253), filename))\n\t}\n\n\tif err = zip.AddDirectory(baseFolderName, exportFolder, zipCallback); err != nil {\n\t\tlogging.LogErrorf(\"create export data zip [%s] failed: %s\", exportFolder, err)\n\t\treturn\n\t}","sourceCodeStart":774,"sourceCodeEnd":810,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/9f775e8a12daef8255556097396f9b2739078892/kernel/model/export.go#L774-L810","documentation":"exportData (invoked via ExportData) wraps any failure of filelock.Copy of the workspace data directory into the localized generic message 14. It is a pass-through wrapper: the original OS error (e.g. permission denied, I/O error) is logged and appended to the localized text.","triggerScenarios":"ExportData called while copying util.WorkspaceDir/data to the export folder fails — source unreadable, destination not writable, file locked, or disk error mid-copy.","commonSituations":"Export target on read-only media; antivirus/file watcher locking .sy files; broken files in data dir; running without OS permissions on the data dir.","solutions":["Read the appended err.Error() detail to find the actual failing file/cause","Verify OS read permission on the workspace data dir and write permission on the export folder","Exclude/close processes locking the files (AV, backup tools) and retry"],"exampleFix":"// diagnose the wrapped cause\nif err := model.ExportData(); err != nil {\n    log.Printf(\"export failed, wrapped cause: %v\", err) // message 14 + underlying copy error\n}","handlingStrategy":"try-catch","validationCode":"if _, err := os.Stat(filepath.Join(util.WorkspaceDir, \"data\")); err != nil { return err }\nif f, err := os.Create(filepath.Join(exportFolder, \".wtest\")); err == nil { f.Close(); os.Remove(f.Name()) } else { return err }","typeGuard":null,"tryCatchPattern":"if _, err := model.ExportData(); err != nil {\n    log.Printf(\"export failed: %v\", err) // localized 14 wraps the real copy error\n}","preventionTips":["Ensure OS read access to workspace data and write access to target","Exclude the workspace from AV/backup locking during export","Check source disk health on repeated I/O errors"],"tags":["export","file-copy","io-error"],"backgroundTag":"file-read-failed","analyzedSha":"9f775e8a12daef8255556097396f9b2739078892","analyzedAt":"2026-09-19T03:17:15.984Z","contentChangedAt":"2026-09-19T03:17:15.984Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}