C++ Windows环境下如何将含..的相对路径转换为绝对路径
Windows平台C++实现带相对标识路径转绝对路径的方案
方案1:使用Windows原生API PathCanonicalize(Windows专属,无需高C++版本支持)
- 该API属于Windows Shell路径处理工具集,原生支持自动解析
\..\、\.\这类相对标识,同时会清理路径中多余的斜杠 - 依赖:需引入头文件
shlwapi.h,编译时链接shlwapi.lib库 - 示例代码:
#include <windows.h> #include <shlwapi.h> #include <iostream> // 自动链接依赖库,也可在项目编译选项中手动配置 #pragma comment(lib, "shlwapi.lib") int main() { TCHAR rawPath[] = TEXT("c:\\test\\engine\\..\\..\\NewFolder"); TCHAR canonicalPath[MAX_PATH]; if (PathCanonicalize(canonicalPath, rawPath)) { // 输出结果为 c:\NewFolder std::wcout << L"规范化后路径:" << canonicalPath << std::endl; } else { std::cout << "处理失败,错误码:" << GetLastError() << std::endl; } return 0; }
- 注意:如果路径长度超过MAX_PATH(默认260字符),需要开启Windows长路径支持,或调用对应扩展版本API。
方案2:使用C++17标准库filesystem模块(优先推荐,跨平台兼容)
- C++17正式纳入标准的
std::filesystem已经封装了路径规范化能力,不需要依赖平台专属API,后续项目跨平台迁移无需修改核心逻辑 - 示例代码:
#include <filesystem> #include <iostream> namespace fs = std::filesystem; int main() { std::wstring rawPath = L"c:\\test\\engine\\..\\..\\NewFolder"; try { // 路径真实存在时使用canonical fs::path absolutePath = fs::canonical(fs::path(rawPath)); // 若路径不存在仅需语法层面规范化,替换为fs::weakly_canonical即可 std::wcout << L"规范化后路径:" << absolutePath << std::endl; } catch (const fs::filesystem_error& e) { std::cout << "处理失败:" << e.what() << std::endl; } return 0; }
- 注意:Visual Studio 2017及以上版本默认支持C17,低版本需要在项目属性的「C语言标准」配置项中手动开启。
方案3:手动解析路径(仅作参考,不推荐生产环境使用)
如果编译环境不支持C++17、也不想依赖Shlwapi库,可以自行实现解析逻辑:
- 将原始路径按
\分割为多个片段,用栈结构存储有效目录段 - 遍历所有片段:遇到普通目录名压入栈,遇到
..则弹出栈顶元素(栈非空时),遇到.直接跳过 - 遍历完成后将栈中元素拼接为完整路径即可
内容的提问来源于stack exchange,提问作者SungJin Kang
相关产品推荐
相关产品推荐

