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

  1. Read the wrapped %s detail to identify the failing file/reason and fix that specific cause
  2. Check write permissions and free space on the export destination
  3. 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

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


AI-assisted analysis of siyuan-note/siyuan@8641553a1f (2026-09-11). Data as JSON: /api/errors/302a16ab48f4f18e. Report an issue: GitHub.