【问题标题】:C++ windows fstream case sensitiveC++ windows fstream 区分大小写
【发布时间】:2015-03-25 06:23:09
【问题描述】:

我注意到在 Windows 上,文件打开不区分大小写。

(例如,fstream("text.txt") 将打开,无论实际文件名是:Text.txt

我该如何让这个区分大小写呢? (除非文件名也匹配正确的大小写,否则文件不会打开)

【问题讨论】:

  • _wfopen 的行为是否相同?这很奇怪,因为 NTFS 是区分大小写的 fs。
  • 我怀疑fstream 是否有为您执行此操作的功能。相反,您可以使用文件系统操作来找出文件的真实名称,并将其与您要查找的文件名进行比较。第一步:stackoverflow.com/questions/74451/…
  • 区分大小写是一种音量策略,因此最好尊重它。 This article 有很多很好的信息。如果您真的想强制区分大小写,可以手动与实际文件名进行比较。
  • fstream 使用 Win32;虽然 NTFS 文件系统支持区分大小写,但 Win32 不支持 .. 所以“Text.txt”和“tExT.txt”可能能够存在于您的 NTFS 卷上的同一目录中,但是当您调用 fstream("text.txt"); 时,它会只打开 1 个文件。如果要区分大小写,则需要链接 POSIX 子系统而不是 Win32 子系统。
  • @txtechhelp 先跳上你的时光机回到 1999 年……

标签: c++ fstream


【解决方案1】:

在 Windows 下,文件系统 API 通常不区分大小写,因此唯一的方法是自己检查文件名的大小写。例如,

bool open_stream_ci(const char* pszName, std::fstream& out)
{
    WIN32_FIND_DATAA wfd;
    HANDLE hFind = ::FindFirstFileA(pszName, &wfd);
    if (hFind != INVALID_HANDLE_VALUE)
    {
        ::FindClose(hFind);
        if (!strcmp(wfd.cFileName, ::PathFindFileNameA(pszName)))
        {
            out.open(pszName);
            return true;
        }
    }
    return false;
}

【讨论】:

  • support.microsoft.com/en-us/kb/100625 ; NTFS 确实支持区分大小写,但是 Win32 子系统不支持 .. 因此 NTFS 卷可以包含区分大小写的文件/文件夹,但是通过 Win32 应用程序(如记事本)读取它只会打开其中的 1 个文件-Win32 子系统的不敏感特性
  • @txtechhelp 说NTFS支持但Win32不支持有点无意义。您在现实生活中还有哪些地方使用 NTFS?
  • 在我的 samba 共享和其他支持 NTFS 的 Linux 系统上
  • @txtechhelp Touche。但是,大概 OP 实际上正在编写 Win32 应用程序,否则他们不会问这个问题。
猜你喜欢
  • 2016-03-04
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 2012-12-01
  • 2013-03-06
  • 2020-02-18
  • 2010-12-09
  • 1970-01-01
相关资源
最近更新 更多