flipped-aurora/gin-vue-admin · error
创建临时文件失败: %w
Error message
创建临时文件失败: %w
What it means
After ensuring the target directory exists, replaceAutoCodeFileAtomically creates a unique temp file (pattern .autocode-*) in that directory. If os.CreateTemp fails — usually due to directory write permission, no free inodes/space, or the directory disappearing — this error wraps the failure. The deferred os.Remove keeps failed temp files from lingering.
Source
Thrown at server/service/system/auto_code_task.go:269
func joinAutoCodeRollbackError(cause, rollbackErr error) error {
if rollbackErr == nil {
return cause
}
return errors.Join(cause, fmt.Errorf("回滚自动代码文件失败: %w", rollbackErr))
}
func replaceAutoCodeFileAtomically(target string, content []byte, mode fs.FileMode) error {
if mode == 0 {
mode = 0o666
}
dir := filepath.Dir(target)
if err := os.MkdirAll(dir, 0o755); err != nil {
return fmt.Errorf("创建目标目录 %s 失败: %w", dir, err)
}
tmp, err := os.CreateTemp(dir, ".autocode-*")
if err != nil {
return fmt.Errorf("创建临时文件失败: %w", err)
}
tmpName := tmp.Name()
defer os.Remove(tmpName)
if _, err = tmp.Write(content); err == nil {
err = tmp.Sync()
}
if closeErr := tmp.Close(); err == nil {
err = closeErr
}
if err != nil {
return fmt.Errorf("写入临时文件失败: %w", err)
}
if err = os.Chmod(tmpName, mode.Perm()); err != nil {
return fmt.Errorf("设置临时文件权限失败: %w", err)
}
if err = os.Rename(tmpName, target); err != nil {
return fmt.Errorf("原子替换 %s 失败: %w", target, err)
}View on GitHub (pinned to 3136500ef3)
Solutions
- Check the wrapped syscall errno and grant write access to the directory for the server process
- Verify disk space and inode availability (df -h / df -i)
- Raise the process fd limit (ulimit -n) if EMFILE occurs during large generation batches
- Ensure nothing (cleanup jobs, antivirus quarantine) removes the directory concurrently
Example fix
// before $ sudo -u www-data test -w server/api/v1 && echo ok || echo no no // after sudo chown -R www-data:www-data server web
Defensive patterns
Strategy: retry
Validate before calling
dir := filepath.Dir(targetPath)
if err := unix.Access(dir, unix.W_OK); err != nil {
return fmt.Errorf("no temp-file create permission in %s", dir)
}
if err := checkDiskSpace(dir, 10*1024*1024); err != nil {
return err
} Try / catch
err := commitAutoCodeFileTask(task, publish, persist)
if err != nil && strings.Contains(err.Error(), "创建临时文件失败") {
var p *os.PathError
if errors.As(err, &p) && errors.Is(p.Err, syscall.EMFILE) {
// raise ulimit -n and retry
}
} Prevention
- Keep project directories writable by the service account
- Raise RLIMIT_NOFILE for processes doing bulk generation
- Keep workspaces off read-only or quota-limited mounts
- Don't run external cleanup jobs over staging directories during generation
When it happens
Trigger: os.CreateTemp(dir, ".autocode-*") returns an error: EACCES on the directory, ENOSPC, EMFILE/ENFILE (fd or inode exhaustion), or read-only mount. Raised from prepareAutoCodeFileTask staging writes and rollback restores.
Common situations: Service running as a user without write access to the project directory, ulimit -n too low under heavy parallel generation, full disk, or the directory was deleted between MkdirAll and CreateTemp by an external cleaner.
Related errors
AI-assisted analysis of flipped-aurora/gin-vue-admin@3136500ef3 (2026-08-31).
Data as JSON: /api/errors/69f3baaa20f27256.
Report an issue: GitHub.