2015-03-25 35 views
3

我注意到,在Windows上,文件打开是不区分大小写的。C++窗口fstream区分大小写

(前fstream("text.txt")无论实际文件名存在的将打开:Text.txt

我怎么会做出这种区分大小写呢? (未打开的文件,除非文件名中的适当情况下也匹配)

+0

_wfopen的行为是否相同?这很奇怪,因为NTFS是一个区分大小写的fs。 – riodoro1 2015-03-25 06:30:39

+0

我怀疑'fstream'是否有这样的功能。相反,您可以使用文件系统操作来查找文件的真实名称,并将其与您正在查找的文件名进行比较。第一步:http://stackoverflow.com/questions/74451/getting-actual-file-name-with-proper-casing-on-windows – 2015-03-25 06:32:34

+0

区分大小写是一个卷策略,所以最好是尊重它。 [本文](http://www.nicklowe.org/2012/02/understanding-case-sensitivity-in-windows-obcaseinsensitive-file_case_sensitive_search/)有很多很好的信息。如果你真的想强制区分大小写,你可以手动比较实际的文件名。 – MooseBoys 2015-03-25 06:37:08

回答

5

在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; 
} 
+0

https://support.microsoft.com/zh-cn/kb/100625; NTFS确实支持大小写敏感的Win32子系统,但是,不要......所以NTFS卷可以有区分大小写的文件/文件夹,但是通过Win32应用程序(如记事本)读取它只会打开其中的一个文件Win32子系统的敏感特性 – txtechhelp 2015-03-25 06:50:27

+0

@txtechhelp说NTFS支持它没有意义,但Win32不支持它。你还在哪里使用NTFS在现实生活中? – 2015-03-25 06:51:27

+0

在我的samba共享和其他支持NTFS的Linux系统上 – txtechhelp 2015-03-25 06:55:54