【问题标题】:Lexical compare std::filesystem::path case insensitive?词法比较 std::filesystem::path 不区分大小写?
【发布时间】:2020-04-21 19:06:06
【问题描述】:

我的问题类似于以下内容:要确定 Windows 平台上的两条路径是否相同,比较路径不区分大小写,ei。 “C:\test.txt”和“C:\Test.txt”解析为相同的文件元素。例如,我可以通过使用std::filesystem::equal 轻松解决这个问题,但是对于这个特殊问题,我想在操作系统往返时节省一点(在空闲时运行并在每个循环上进行 100 次以上的比较 - 我很害怕它会很明显)

using path = std::filesystem::path;
const bool result =  (path("C:\\test.txt").lexically_normal().make_preferred().native() == path("C:\\Test.txt").lexically_normal().make_preferred().native());

在比较std::filesystem::path 时,即使通过调用lexical_normal 进行词法规范化也是以通用方式完成的,因此会考虑这种情况。这当然是有道理的,但是除了自己进行字符串比较之外,我看不到在不比较的情况下对库进行此操作的方法:是否有可能以某种方式覆盖路径的比较方式?

我也查看了boost::filesystem,但据我所知也没有解决问题。

【问题讨论】:

  • 我相信这取决于操作系统的文件系统。在 Windows 上,它不区分大小写,随后 std::filesystem::path 应该是相同的。另一方面,在 Linux 文件系统上,它是区分大小写的。

标签: c++ c++17 std-filesystem


【解决方案1】:

path/filesystem 区别的全部意义在于区分path 类型作为一种通用机制,用于存储可以与任何文件系统一起操作和使用的路径,以及filesystem 特定的操作可能根据特定的实现而有所不同。两个不相等的 path 对象可以被一个文件系统视为 filesystem::equivalent 而不是另一个文件系统只是交易的一部分。

没有机制可以执行文件系统感知path“规范化”而不是文件系统操作。

【讨论】:

  • 与其从“文件系统感知”的角度来看待这一点,我认为从应用程序需求的角度来考虑更有意义。应用程序如何利用 filesystem::path 来实现路径语义,同时添加不区分大小写的约束?例如,服务(例如 git 服务)可能需要阻止不区分大小写的文件路径冲突,以支持其客户端之间的最小公分母。
  • @JohnDoggett:文件系统 API 不允许您访问任何文件系统;它们的存在是为了允许您访问特定的文件系统:由您的操作系统提供的文件系统。当然,您可以尝试在该上下文之外使用path 的机制,但它可能不会很好。
  • 听起来我误解了你的开场白。我以为您的意思是文件系统和路径旨在分别擅长文件系统访问和路径语义。相反,听起来路径类仅用于表达与文件系统的实际交互。这是不幸的,因为应用程序中的很多工作都在为与文件系统交互的潜力建模,在提交之前计划和验证工作。早期的建模逻辑是花哨的路径语义有用的地方。
  • @NicolBolas 你不承认这个问题(基本上它不可能在语义上比较某些 FS 类型的 FS 元素......)?如果您建议至少一种原始问题的解决方案,则此答案可能会大大改善(因为答案基本上是:“这是不可能的”)。
  • @darune:文件系统特定的比较必须是文件系统的一部分,而不是path的一部分。如果您想实现它,您将基本上从这些路径中提取字符串并通过字符串进行比较,因为您实际上没有有效的方法来访问 path 的内部。
猜你喜欢
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 2012-08-16
相关资源
最近更新 更多