{"record":{"id":"c16e422aca0bb146","repo":"AlistGo/alist","slug":"merge-file-s-w","errorCode":null,"errorMessage":"merge file %s: %w","messagePattern":"merge file (.+?): %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"drivers/sjtu_netdisk/driver.go","lineNumber":313,"sourceCode":"\t\t\t\t\t\tSize:     child.GetSize(),\n\t\t\t\t\t\tIsFolder: true,\n\t\t\t\t\t}\n\t\t\t\t\t_, mergeErr := d.Move(ctx, childObj, &model.Object{\n\t\t\t\t\t\tPath:     targetPath,\n\t\t\t\t\t\tName:     srcObj.GetName(),\n\t\t\t\t\t\tIsFolder: true,\n\t\t\t\t\t})\n\t\t\t\t\tif mergeErr != nil {\n\t\t\t\t\t\treturn nil, fmt.Errorf(\"merge subfolder %s: %w\", child.GetName(), mergeErr)\n\t\t\t\t\t}\n\t\t\t\t} else if childErr != nil {\n\t\t\t\t\treturn nil, fmt.Errorf(\"merge subfolder %s: %w\", child.GetName(), childErr)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// child item is file\n\t\t\t\tfileErr := d.moveItem(ctx, childSrcPath, targetDstPath, child.GetName(), false, \"overwrite\")\n\t\t\t\tif fileErr != nil {\n\t\t\t\t\treturn nil, fmt.Errorf(\"merge file %s: %w\", child.GetName(), fileErr)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// delete empty srcObj folder\n\t\t_ = d.Remove(ctx, srcObj)\n\n\t\treturn &model.Object{\n\t\t\tName:     srcObj.GetName(),\n\t\t\tSize:     srcObj.GetSize(),\n\t\t\tIsFolder: true,\n\t\t\tModified: srcObj.ModTime(),\n\t\t\tCtime:    srcObj.CreateTime(),\n\t\t\tPath:     targetPath,\n\t\t}, nil\n\t}\n}\n","sourceCodeStart":295,"sourceCodeEnd":331,"githubUrl":"https://github.com/AlistGo/alist/blob/843d9dc8149126976b2625911e45a4d3ffd6f2f5/drivers/sjtu_netdisk/driver.go#L295-L331","documentation":"During a merge-move in the SJTU driver, moving one child FILE via moveItem(..., isFolder=false, \"overwrite\") failed. The message names the file. The overwrite strategy is forced for files, so a failure is an API/transport problem, not a conflict.","triggerScenarios":"Move folder into an existing folder of the same name; the per-file move PUT call errors (expired token, 5xx, file locked server-side).","commonSituations":"Large folder merges where one file fails and aborts the whole operation; files open/locked by another client; intermittent API errors during bulk moves.","solutions":["Identify the named file and retry moving just its parent folder (already-moved items are idempotent under overwrite)","Check the wrapped error for auth or permission causes and fix them","Close other clients that may hold the file, then retry","For very large folders, split the move into per-subfolder operations"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"merge file\") {\n    f := extractFileName(err)\n    return moveSingleFile(ctx, f) // overwrite strategy makes retries safe\n}","preventionTips":["Close files held open by other clients before moving","Retry the named file — 'overwrite' makes it idempotent","Split very large merges into smaller batches"],"tags":["sjtu-netdisk","move","merge","file"],"backgroundTag":null,"analyzedSha":"843d9dc8149126976b2625911e45a4d3ffd6f2f5","analyzedAt":"2026-08-15T12:14:11.722Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}