GetCurrentDirectory()可能触发的Windows系统错误码及解读方法
GetCurrentDirectory() 错误处理指南
一、实际可能触发的错误码及解读
GetCurrentDirectory() 实际会触发的错误码范围很窄,核心集中在以下几种:
- ERROR_INSUFFICIENT_BUFFER (0x7A):最常见的错误,当传入的缓冲区大小不足以容纳当前目录路径(含终止符)时触发。此时函数返回0,调用
GetLastError()会得到该错误码,同时返回值会告知所需的缓冲区长度。 - ERROR_INVALID_PARAMETER (0x57):若传入的缓冲区指针为NULL,或者缓冲区大小为0但并非用于查询所需长度(即不是先调用一次传0获取大小的场景),会触发这个错误。
- ERROR_ACCESS_DENIED (0x5):极端罕见场景,只有当进程令牌被严格限制,完全无法访问当前目录的元数据时才会触发,但这种情况几乎不会遇到,因为当前目录的查询权限默认是开放的。
二、测试场景未报错的原因
你测试的两种情况都不会触发错误,逻辑如下:
- 移除可移动驱动器仍返回原路径:Windows会在进程内部缓存当前目录的逻辑路径,即使对应的物理设备已移除,单纯查询路径时系统直接读取缓存,不会触发IO类错误。只有当你对该路径执行读写等实际操作时,才会出现
ERROR_PATH_NOT_FOUND或ERROR_DEVICE_NOT_READY。 - 祖先目录无权限仍返回路径:查询当前目录路径不需要遍历验证祖先目录的权限,系统直接读取进程内部缓存的路径字符串,不会触发权限校验错误。
三、错误处理实现示例
- 先查询所需缓冲区大小
DWORD requiredSize = GetCurrentDirectory(0, NULL); if (requiredSize == 0) { DWORD err = GetLastError(); // 处理非ERROR_INSUFFICIENT_BUFFER的异常 if (err != ERROR_INSUFFICIENT_BUFFER) { // 日志记录或错误提示逻辑 } } - 分配缓冲区并获取路径
LPSTR buffer = (LPSTR)LocalAlloc(LPTR, requiredSize * sizeof(CHAR)); if (buffer == NULL) { // 内存分配失败处理 } DWORD result = GetCurrentDirectory(requiredSize, buffer); if (result == 0) { DWORD err = GetLastError(); switch (err) { case ERROR_INSUFFICIENT_BUFFER: // 理论上不会出现,除非两次调用间路径长度变化 break; case ERROR_INVALID_PARAMETER: // 检查缓冲区指针或参数合法性 break; case ERROR_ACCESS_DENIED: // 极端权限场景处理 break; default: // 罕见错误兜底处理 break; } } // 使用路径后释放缓冲区 LocalFree(buffer);
内容的提问来源于stack exchange,提问作者ridilculous
相关产品推荐
相关产品推荐

