如何在C语言中获取区分大小写的当前工作目录?
获取区分大小写的当前工作目录(Windows平台C语言实现)
Windows文件系统(如NTFS)虽支持大小写区分,但默认是大小写不敏感的,标准C库的getcwd()函数返回的路径会统一为标准化格式(比如全小写),无法反映目录的真实大小写。要获取区分大小写的当前工作目录,必须借助Win32 API实现,以下是具体方案:
核心思路
通过Win32 API的CreateFileW打开当前目录,再用GetFinalPathNameByHandleW获取该目录的真实路径,这个路径会保留NTFS上存储的原始大小写格式。
代码实现
替换原有getcwd的调用逻辑,改用以下代码:
#include <windows.h> #include <stdio.h> #include <stdlib.h> #include <string.h> // 获取区分大小写的当前工作目录 BOOL GetCaseSensitiveCWD(WCHAR* buffer, DWORD bufferSize) { // 打开当前目录 HANDLE hDir = CreateFileW(L".", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); if (hDir == INVALID_HANDLE_VALUE) { return FALSE; } // 获取真实路径 DWORD pathLen = GetFinalPathNameByHandleW(hDir, buffer, bufferSize, VOLUME_NAME_DOS); CloseHandle(hDir); if (pathLen == 0 || pathLen > bufferSize) { return FALSE; } // 移除可能的"\\?\"前缀(如果存在) if (wcsncmp(buffer, L"\\\\?\\", 4) == 0) { memmove(buffer, buffer + 4, (pathLen - 3) * sizeof(WCHAR)); } return TRUE; } // 示例调用 int main() { WCHAR path[MAX_PATH]; const WCHAR* fullpath = L"C:\\Temp"; // 支持任意大小写形式的输入路径 if (SetCurrentDirectoryW(fullpath)) { // 替换chdir,宽字符版本更可靠 if (GetCaseSensitiveCWD(path, MAX_PATH)) { wprintf(L"真实大小写路径:%ls\n", path); } else { printf("获取真实路径失败,错误码:%lu\n", GetLastError()); } } else { printf("切换目录失败,错误码:%lu\n", GetLastError()); return 1; } return 0; }
关键说明
- 宽字符API:使用
SetCurrentDirectoryW替代chdir,GetFinalPathNameByHandleW等宽字符版本API,避免多字节编码的问题,确保路径处理准确。 - 目录打开参数:
FILE_FLAG_BACKUP_SEMANTICS是打开目录的必要参数,让CreateFileW可以处理目录而非普通文件。 - 路径前缀处理:
GetFinalPathNameByHandleW可能返回带\\?\前缀的路径,需要手动移除以得到标准的DOS格式路径。 - 错误处理:每个API调用后都需要检查返回值,通过
GetLastError()获取具体错误信息,方便调试。
注意事项
- 该方案仅适用于Windows平台,依赖Win32 API,跨平台代码需要做条件编译。
- 只有当目录所在的文件系统(如NTFS)实际存储了大小写信息时,才能返回正确的区分大小写路径;如果是FAT32等不支持大小写区分的文件系统,返回的路径仍会是标准化形式。
内容的提问来源于stack exchange,提问作者Hrushikesh Dharmadhikari
相关产品推荐
相关产品推荐

