【问题标题】:Resolving a relative path without referencing the current directory on Windows在不引用 Windows 上的当前目录的情况下解析相对路径
【发布时间】:2015-05-11 05:17:54
【问题描述】:

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

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

例如:您从C:\appfolder\exes\myapp.exe 运行您的应用程序,而数据在C:\appfolder\data 中。我想将sillyfolder\..\mydata.txt 解析为C:\appfolder\data\mydata.txt。

【问题讨论】:

  • 你能举个例子吗?
  • 我不认为有这个 API。我相信通常的方法是将两个部分附加在一起(显然带有反斜杠)并以非规范形式留下路径。如果您知道该文件存在,我想您可以打开它然后调用 GetFinalPathNameByHandle。
  • @HarryJohnston,在连接绝对基目录和相对目录后,为什么不调用GetFullPathName 来删除任何"." 和".." 路径组件?如果您需要解析完整路径中的符号链接,GetFinalPathNameByHandle 很有用,但您可能必须迭代回可以打开的路径组件,然后附加无法访问的其余路径(要么'不存在或您无权访问)。
  • @eryksun:GetFullPathName 的文档没有说明如果您将绝对路径传递给它会做什么(如果有的话)。
  • @HarryJohnston,缺少文档,例如他们没有讨论L"con" 如何变成L"\\\\.\\con",或者使用(和验证)环境变量(例如"=D:")作为驱动器相对路径。 ReactOS 在RtlGetFullPathName_UstrEx 和RtlGetFullPathName_Ustr 中对其中的一些进行了逆向工程。 FWIW,文档确实提供了 3 个示例:\\test-2\q$\lh、\\?\UNC\test-2\q$\lh 和 U:。

标签: c++ windows path relative-path msdn


【解决方案1】:

标准(C++ 或 Win32)库似乎不适合您。但是制作相对路径是一个很好的练习。以下是一些有用的链接,可以帮助您了解如何开始(将脚本视为伪代码):

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

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

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

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

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

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

对于后一种情况(UNC 路径),如果 current 和 target 路径不在同一主机上,则相对路径没有意义。但是,设备名和路径名并没有那么紧密地绑定在一起(请注意,Windows 稍后添加了使用 chdir 更改设备的功能,如option),并且根据应用程序,可以通过仅考虑路径来在设备之间创建相对路径名部分。

【讨论】:

  • OP 想要将相对路径转换为绝对路径,而不是相反。
  • 第一个链接应该很有用。关键是可能没有标准调用,通过查看其他人的工作,OP 可能会学习如何做到这一点。
猜你喜欢
  • 2019-03-08
  • 2020-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 2015-11-26
  • 2020-06-07
  • 1970-01-01
相关资源
最近更新 更多