2015-03-25 32 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