siyuan-note/siyuan · error
Conf.Language(14) (copy data dir failed: %s)
Error message
Conf.Language(14) (copy data dir failed: %s)
What it means
exportData (called by ExportData) copies the workspace data directory via filelock.Copy; if that copy fails, it wraps the OS error with Conf.Language(14) ('Export failed: %s'). The inner err.Error() carries the underlying reason (permission, file-in-use, IO error).
Source
Thrown at kernel/model/export.go:789
func exportData(exportFolder string) (zipPath string, err error) {
FlushTxQueue()
if err = EnsureAllSyncAssets(); err != nil {
return
}
logging.LogInfof("exporting data...")
baseFolderName := "data-" + util.CurrentTimeSecondsStr()
if err = os.MkdirAll(exportFolder, 0755); err != nil {
logging.LogErrorf("create export temp folder failed: %s", err)
return
}
data := filepath.Join(util.WorkspaceDir, "data")
if err = filelock.Copy(data, exportFolder); err != nil {
logging.LogErrorf("copy data dir from [%s] to [%s] failed: %s", data, baseFolderName, err)
err = fmt.Errorf(Conf.Language(14), err.Error())
return
}
zipPath = exportFolder + ".zip"
zip, err := gulu.Zip.Create(zipPath)
if err != nil {
logging.LogErrorf("create export data zip [%s] failed: %s", exportFolder, err)
return
}
zipCallback := func(filename string) {
util.PushEndlessProgress(Conf.language(65) + " " + fmt.Sprintf(Conf.language(253), filename))
}
if err = zip.AddDirectory(baseFolderName, exportFolder, zipCallback); err != nil {
logging.LogErrorf("create export data zip [%s] failed: %s", exportFolder, err)
return
}View on GitHub (pinned to 8641553a1f)
Solutions
- Read the wrapped %s detail to identify the failing file/reason and fix that specific cause
- Check write permissions and free space on the export destination
- Close other processes holding workspace files (sync clients, editors, antivirus) and retry
Example fix
// before util.ExportData() // -> Export failed: ... access is denied // after chmod/write-enable destination dir, close file locks, then util.ExportData()
Defensive patterns
Strategy: try-catch
Validate before calling
const targetOk = await canWrite(exportFolder);
const freeOk = (await getDiskUsage(exportFolder)).free > 0;
if (!targetOk || !freeOk) throw new Error("Export destination is not writable"); Try / catch
try {
await exportData();
} catch (e) {
// Conf.Language(14) wraps the OS error in e.msg after 'Export failed: '
const inner = String(e.msg).split(": ").slice(1).join(": ");
logDetailed(inner); // e.g. ENOSPC / EACCES / file-in-use
} Prevention
- Ensure export destination is writable and has free space
- Exclude the workspace/data dir from antivirus and sync tools to avoid transient file locks
- Read the wrapped inner OS error to pinpoint the failing file before retrying
When it happens
Trigger: filelock.Copy(workspace/data, exportFolder) fails during export-data — any OS-level copy error while duplicating the data dir.
Common situations: Destination volume full or write-protected; file locked by another process (Windows AV/indexer); permission denied on target folder; source file deleted mid-copy by sync.
Understand the failure class
Background: "failed to write file", "Could not save figure", "Error saving remote file" — file write failed: causes and fixes across languages and libraries — this error's family across 38 libraries.
Related errors
- Export failed: %s
- read session file failed: %w
- create session dir failed: %w
- save session file failed: %w
- export source [%s] is not a regular file
AI-assisted analysis of siyuan-note/siyuan@8641553a1f (2026-09-11).
Data as JSON: /api/errors/302a16ab48f4f18e.
Report an issue: GitHub.