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++ 中的文件名区分大小写?