You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;
}

关键说明

  1. 宽字符API:使用SetCurrentDirectoryW替代chdir,GetFinalPathNameByHandleW等宽字符版本API,避免多字节编码的问题,确保路径处理准确。
  2. 目录打开参数:FILE_FLAG_BACKUP_SEMANTICS是打开目录的必要参数,让CreateFileW可以处理目录而非普通文件。
  3. 路径前缀处理:GetFinalPathNameByHandleW可能返回带\\?\前缀的路径,需要手动移除以得到标准的DOS格式路径。
  4. 错误处理:每个API调用后都需要检查返回值,通过GetLastError()获取具体错误信息,方便调试。

注意事项

  • 该方案仅适用于Windows平台,依赖Win32 API,跨平台代码需要做条件编译。
  • 只有当目录所在的文件系统(如NTFS)实际存储了大小写信息时,才能返回正确的区分大小写路径;如果是FAT32等不支持大小写区分的文件系统,返回的路径仍会是标准化形式。

内容的提问来源于stack exchange,提问作者Hrushikesh Dharmadhikari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 15:02:44