Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 词法比较std::filesystem::path不区分大小写?_C++_C++17_Std Filesystem - Fatal编程技术网

C++ 词法比较std::filesystem::path不区分大小写?

C++ 词法比较std::filesystem::path不区分大小写?,c++,c++17,std-filesystem,C++,C++17,Std Filesystem,我的问题如下:要确定windows平台上的两个路径是否相同,请比较不区分大小写的路径,即ei。“C:\test.txt”和“C:\test.txt”解析为同一文件元素。例如,我可以通过使用std::filesystem::equal轻松解决这个问题,但对于这个特殊的问题,我希望在操作系统往返时节省一点时间(在空闲状态下运行,并在每个循环上进行100+比较-我担心这会很明显) 在比较std::filesystem::path时,即使通过调用lexical_normal进行词汇规范化,也会以通用方式

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

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


我还研究了
boost::filesystem
,但据我所知,它也没有解决这个问题。

路径/文件系统区别的全部要点是将
路径
类型作为一种通用机制来存储可被任何文件系统操纵和使用的路径,以及
文件系统
特定的操作,这些操作可能根据特定的实现而有所不同。两个不相等的
path
对象可以被一个文件系统而不是另一个文件系统视为等价的
filesystem::equired
,这只是交易的一部分


没有任何机制可以执行文件系统感知的
路径
非文件系统操作的“规范化”。

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


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

我相信这取决于操作系统的文件系统。在Windows上,它不区分大小写,因此
std::filesystem::path
应该相同。另一方面,在Linux文件系统上,它是区分大小写的,我相信这取决于操作系统的文件系统。在Windows上,它不区分大小写,因此
std::filesystem::path
应该相同。另一方面,在Linux文件系统上,它是区分大小写的。与其从“文件系统感知”的角度来看待这一点,我认为从应用程序需求的角度来思考更有意义。应用程序如何利用filesystem::path实现路径语义,同时添加大小写不敏感的约束?例如,服务(如git服务)可能需要阻止不区分大小写的文件路径冲突,以支持其客户端中最小的公分母。@JohnDoggett:文件系统API不允许您访问任何文件系统;它们的存在是为了允许您访问特定的文件系统:您的操作系统提供的文件系统。当然,你可以尝试在上下文之外使用
path
的机制,但这可能不会很好。听起来我误解了你的开场白。我认为您的意思是,文件系统和路径旨在分别独立地擅长文件系统访问和路径语义。相反,听起来path类只用于表示与文件系统的实际交互。这是不幸的,因为应用程序中的很多工作都是在建模与文件系统交互的可能性,在提交之前规划和验证工作。早期的建模逻辑是奇特的路径语义有用的地方。@Nicolas你不承认这个问题(基本上不可能比较某些FS类型的FS元素语义…)?如果您对原始问题提出至少一种解决方案(因为答案基本上是:“这是不可能的”)。@darune:特定于文件系统的比较必须是文件系统的一部分,而不是
路径的一部分。如果你想实现这一点,你基本上需要从这些路径中提取字符串,并通过字符串对它们进行比较,因为你实际上没有一种有效的方法来访问
路径的内部,我认为从应用程序需求的角度考虑更有意义。应用程序如何利用filesystem::path实现路径语义,同时添加大小写不敏感的约束?例如,服务(如git服务)可能需要阻止不区分大小写的文件路径冲突,以支持其客户端中最小的公分母。@JohnDoggett:文件系统API不允许您访问任何文件系统;它们的存在是为了允许您访问特定的文件系统:您的操作系统提供的文件系统。当然,你可以尝试在上下文之外使用
path
的机制,但这可能不会很好。听起来我误解了你的开场白。我认为您的意思是,文件系统和路径旨在分别独立地擅长文件系统访问和路径语义。相反,听起来path类只用于表示与文件系统的实际交互。这是不幸的,因为应用程序中的很多工作都是在建模与文件系统交互的可能性,在提交之前规划和验证工作。早期的建模逻辑正是花哨的路径语义有用的地方@
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());