Skip to content

Conversation

@Kakueeen
Copy link
Contributor

  1. Added errno.h include for error number handling
  2. Implemented setErrorFromErrno() method to map system errno values to
    DFM IO error codes
  3. Enhanced renameFile() to use errno-based error reporting instead of
    hardcoded permission denied error
  4. Added comprehensive error code mapping for common file operation
    errors

Log: Improved error messages for file rename operations

Influence:

  1. Test file renaming with various error conditions (permission denied,
    file not found, etc.)
  2. Verify error messages accurately reflect the actual system error
  3. Test cross-device rename operations
  4. Validate error handling for disk full scenarios
  5. Check filename length limit error reporting

feat: 改进文件重命名错误处理

  1. 添加 errno.h 包含以处理错误编号
  2. 实现 setErrorFromErrno() 方法,将系统 errno 值映射到 DFM IO 错误代码
  3. 增强 renameFile() 使用基于 errno 的错误报告,替代硬编码的权限拒绝错误
  4. 添加了常见文件操作错误的全面错误代码映射

Log: 改进了文件重命名操作的错误提示信息

Influence:

  1. 在各种错误条件下测试文件重命名(权限拒绝、文件未找到等)
  2. 验证错误信息准确反映实际系统错误
  3. 测试跨设备重命名操作
  4. 验证磁盘空间不足场景的错误处理
  5. 检查文件名长度限制错误报告

BUG: https://pms.uniontech.com/bug-view-341997.html

1. Added errno.h include for error number handling
2. Implemented setErrorFromErrno() method to map system errno values to
DFM IO error codes
3. Enhanced renameFile() to use errno-based error reporting instead of
hardcoded permission denied error
4. Added comprehensive error code mapping for common file operation
errors

Log: Improved error messages for file rename operations

Influence:
1. Test file renaming with various error conditions (permission denied,
file not found, etc.)
2. Verify error messages accurately reflect the actual system error
3. Test cross-device rename operations
4. Validate error handling for disk full scenarios
5. Check filename length limit error reporting

feat: 改进文件重命名错误处理

1. 添加 errno.h 包含以处理错误编号
2. 实现 setErrorFromErrno() 方法,将系统 errno 值映射到 DFM IO 错误代码
3. 增强 renameFile() 使用基于 errno 的错误报告,替代硬编码的权限拒绝错误
4. 添加了常见文件操作错误的全面错误代码映射

Log: 改进了文件重命名操作的错误提示信息

Influence:
1. 在各种错误条件下测试文件重命名(权限拒绝、文件未找到等)
2. 验证错误信息准确反映实际系统错误
3. 测试跨设备重命名操作
4. 验证磁盘空间不足场景的错误处理
5. 检查文件名长度限制错误报告

BUG: https://pms.uniontech.com/bug-view-341997.html
@deepin-ci-robot
Copy link

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: Kakueeen

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@deepin-ci-robot
Copy link

deepin pr auto review

这段代码主要增加了对 errno 的错误码转换功能,用于在文件操作失败时提供更精确的错误信息。以下是对这段代码的审查意见,包括语法逻辑、代码质量、代码性能和代码安全四个方面:

1. 语法逻辑

  • 正确性:代码逻辑基本正确,通过 switch-case 结构将系统 errno 映射到自定义的 DFMIOErrorCode 枚举。
  • 完整性:覆盖了大多数常见的 errno 错误码,但可能还有其他错误码未处理(如 ELOOPENFILE 等)。建议根据实际需求考虑是否需要补充。
  • 默认处理default 分支将未处理的错误码映射为 DFM_IO_ERROR_FAILED,这是合理的做法。

2. 代码质量

  • 可读性:代码结构清晰,switch-case 分支明确,注释合理。
  • 可维护性:如果未来需要增加新的错误码映射,只需在 switch-case 中添加新的分支,维护性较好。
  • 一致性:新增的 setErrorFromErrno 函数与现有的 setErrorFromGError 函数风格一致,符合项目规范。

3. 代码性能

  • 性能影响switch-case 的性能通常优于 if-else,且错误处理路径通常不是性能瓶颈,因此这段代码对性能影响很小。
  • 建议:如果 setErrorFromErrno 会被频繁调用,可以考虑将 errnoValueerrorCode 的映射缓存为静态查找表(如 std::mapQMap),以减少分支预测的开销。

4. 代码安全

  • 线程安全errno 是线程局部的(thread-local),因此 errno 的读取是线程安全的。但需确保 setErrorFromErrno 的调用时机正确,即在 g_rename 失败后立即调用,避免其他操作覆盖 errno
  • 错误码覆盖:部分 errno 可能被多个条件触发(如 EEXISTENOTEMPTY 都映射到 DFM_IO_ERROR_EXISTS),需确认这种合并是否符合业务逻辑。
  • 潜在问题g_rename 是 GLib 的封装函数,其失败时 errno 的值可能与预期不完全一致(例如,GLib 可能会先设置 GError 而不是直接修改 errno)。建议确认 g_rename 的行为是否符合预期。

改进建议

  1. 补充注释:为 setErrorFromErrno 函数添加注释,说明其用途和参数含义。
  2. 错误码映射:根据实际需求补充更多 errno 的映射(如 ELOOPENFILE 等)。
  3. 静态查找表:如果性能是关键,可以将 errnoValueerrorCode 的映射改为静态查找表。
  4. 单元测试:为 setErrorFromErrno 添加单元测试,覆盖所有 switch-case 分支和默认情况。
  5. 错误信息增强:除了设置错误码,还可以考虑设置错误描述(如 error.setMessage(strerror(errnoValue))),以便调试。

优化后的代码示例

void DOperatorPrivate::setErrorFromErrno(int errnoValue)
{
    DFMIOErrorCode errorCode;
    switch (errnoValue) {
    case EACCES:
    case EPERM:
        errorCode = DFM_IO_ERROR_PERMISSION_DENIED;
        break;
    case ENOENT:
        errorCode = DFM_IO_ERROR_NOT_FOUND;
        break;
    case EEXIST:
    case ENOTEMPTY:
        errorCode = DFM_IO_ERROR_EXISTS;
        break;
    case EISDIR:
        errorCode = DFM_IO_ERROR_IS_DIRECTORY;
        break;
    case ENOTDIR:
        errorCode = DFM_IO_ERROR_NOT_DIRECTORY;
        break;
    case EROFS:
        errorCode = DFM_IO_ERROR_READ_ONLY;
        break;
    case ENOSPC:
        errorCode = DFM_IO_ERROR_NO_SPACE;
        break;
    case ENAMETOOLONG:
        errorCode = DFM_IO_ERROR_FILENAME_TOO_LONG;
        break;
    case EINVAL:
        errorCode = DFM_IO_ERROR_INVALID_ARGUMENT;
        break;
    case EBUSY:
        errorCode = DFM_IO_ERROR_BUSY;
        break;
    case EXDEV:
        errorCode = DFM_IO_ERROR_NOT_SUPPORTED;
        break;
    case ELOOP:
        errorCode = DFM_IO_ERROR_TOO_MANY_LINKS;
        break;
    case ENFILE:
    case EMFILE:
        errorCode = DFM_IO_ERROR_TOO_MANY_OPEN_FILES;
        break;
    default:
        errorCode = DFM_IO_ERROR_FAILED;
        break;
    }

    error.setCode(errorCode);
    error.setMessage(strerror(errnoValue)); // 可选:设置错误描述
}

总结

这段代码整体质量较高,逻辑清晰,但可以通过补充错误码映射、增强错误信息和添加单元测试来进一步提升健壮性和可维护性。

@Kakueeen
Copy link
Contributor Author

/forcemerge

@deepin-bot
Copy link

deepin-bot bot commented Jan 13, 2026

This pr force merged! (status: unstable)

@deepin-bot deepin-bot bot merged commit c98b7e5 into linuxdeepin:master Jan 13, 2026
19 of 20 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants