C++ windows fstream 区分大小写

Posted

技术标签:

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

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

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

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

【问题讨论】:

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

以上是关于C++ windows fstream 区分大小写的主要内容,如果未能解决你的问题,请参考以下文章

<fstream> 与 <fstream.h> 分别在啥情况下使用?

有没有一种方法可以忽略 Qt c++ 中的文件名区分大小写?

Windows std::fstream 在 open() 之后修改文件?

c++ fstream::read 只返回第一个字符

c++使用文件流fstream换行符的保存,该如何解决

接受所有数据类型的不区分大小写的 C++ 排序?