【问题标题】:get case-correct file name on macOS [duplicate]在 macOS 上获取大小写正确的文件名 [重复]
【发布时间】:2021-12-18 01:06:45
【问题描述】:

我在 macOS 上(文件名不区分大小写),我需要找出文件的实际大小写正确名称。例如,我不知道我的文件是否有名称 A.txt 或 a.txt 或 A.TXT 或 a.TXT 等。我想在屏幕上正确显示名称。

C/C++中最快的方法是什么?

更新:我也尝试了<filesystem> 和 Qt 框架(我的应用程序在 Qt 中)。但是这些库唯一可能的解决方案似乎是读取父目录中所有条目的完整列表,然后比较这些子项中是否有任何与给定名称模式匹配。出于性能原因,这显然是不可行的。

【问题讨论】:

  • 有人选择了“需要更多关注”。我不同意这种观点。我会选择“缺乏细节或清晰度”或“需要调试细节”之类的东西。但我最近了解到这样一个事实,即关于 SO 的问题不需要最低限度的努力。你试过<filesystem>吗?
  • 哦,是的。我应该提到我也尝试过 和 Qt 框架(我的应用程序在 Qt 中)。但唯一可能的解决方案似乎是读取父目录中所有条目的完整列表,然后比较其中是否有任何与名称模式不匹配。 (我要更新问题)
  • 如果没有一致的命名,可能值得强制使用一个小脚本通过目录并将所有内容重命名为全部小写。
  • @user4581301 不,我不想更改实际名称(它们是用户的文件,不是我的!)。我的问题是关于如何获得实际大小写正确的名称,因为我只知道例如小写名称。
  • 关于“macOS(文件名不区分大小写)”:区分大小写或不区分大小写是文件系统的属性,而不是 macOS。

标签: c++ c macos


【解决方案1】:

std::filesystem::canonical 将文件的大小写转换为磁盘路径(至少在 macOS 和 Windows 上的 Visual Studio 上,我不确定这是标准的要求):

在当前目录下有个文件叫test.cpp下面的程序 打印:

"/Users/user/test.cpp"
#include <filesystem>
#include <iostream>

int main()
{
  std::filesystem::path p("TEST.cpp");
  std::cout << std::filesystem::canonical(p) << "\n";
}

同样的程序也适用于绝对路径。

【讨论】:

  • 是的...这是我没有的 C++17 :(
  • 你说你试过&lt;filesystem&gt;
  • @sweenish 是的,我尝试了 ,它在我的旧 Mac 机器上可用。这是出于某种晦涩的原因而不是 C++17 ......所以我在文件系统命名空间中看不到规范。并且根据文档,规范确保仅删除 .和 .. 和符号链接。没有关于大小写正确性的说法。
  • 它返回一个规范路径,在只涉及点和符号链接的区分大小写的文件系统上,但在区分大小写的文件系统上它也会检查大小写
  • 感谢您的回答。它可能有效,但我无法测试它,因为我不是用 C++17 构建的。但是我遵循了 filesystem::canonical() 的文档和源代码,它接缝了它从 stdlib.h 调用 realpath()。即使在我的构建设置中没有 C++17,我也可以使用这个函数。但它具有非常不幸的遵循符号链接的属性,这是我绝对不想要的。所以我继续寻找合适的解决方案......
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 2019-06-16
  • 1970-01-01
相关资源
最近更新 更多