在不引用 Windows 上的当前目录的情况下解析相对路径

Resolving a relative path without referencing the current directory on Windows

我有一个 windows cpp 应用程序,我想在不更改当前目录的情况下解析相对于特定目录的路径。这意味着我不能使用 GetFullPathName 因为它解析相对于当前目录的路径。由于这是一个安全敏感问题,我宁愿不自己动手,而是使用经过批准的 API.

我四处寻找好的答案,但找不到任何东西。当然,这是 Web 服务器或多线程环境的常见问题。其他人如何做到这一点?任何帮助将不胜感激。

例如:您 运行 来自 C:\appfolder\exes\myapp.exe 的应用,而数据位于 C:\appfolder\data。我想将 sillyfolder\..\mydata.txt 解析为 C:\appfolder\data\mydata.txt

标准(C++ 或 Win32)库似乎不会为您做这件事。但是创建相对路径是一个很好的练习。这里有一些有用的链接,可以了解如何开始(将脚本视为 伪代码 ):

将绝对路径名转换为相对路径需要

  • 应该转换的给定目标路径
  • 当前目录的路径。

转换将作为字符串操作完成:

  • 首先找到以路径分隔符结尾的最长公共前缀。
  • 如果没有共同的前缀,你就完成了
  • 从(...的副本)当前和目标字符串中去除公共前缀
  • current 字符串中的每个目录名替换为“..”
  • 在目标字符串前面添加(使用路径分隔符)
  • return 组合字符串

与 Unix 路径名不同(除了“/”与“\”作为分隔符的意义之外),Windows 路径名具有额外的复杂性:

  • 在同一台机器中,它们可以有设备名称(一个字母后跟一个“:”)
  • UNC pathnames,以“\”开头。

对于后一种情况(UNC路径),如果currenttarget路径不在同一主机上,则相对路径毫无意义。然而,设备名和路径名并没有紧密地结合在一起(请注意 Windows 之后添加了使用 chdir 更改设备的能力,作为 option),并且根据应用程序,可以在两者之间创建相对路径名仅考虑路径部分的设备。