2011-06-30 52 views
3

我知道ofstream在Windows 7隱藏文件上不起作用。ofstream不能在Windows 7隱藏文件上工作

這是快速測試代碼。

#include <fstream> 
#include <iostream> 
#include <tchar.h> 
#include <windows.h> 

int main() {  
    { 
     std::ifstream file2(_T("c:\\a.txt")); 
     if (file2.is_open()) { 
      std::cout << "ifstream open" << std::endl; 
     } else { 
      std::cout << "ifstream not open!" << std::endl; 
     } 
    } 

    // SetFileAttributes(_T("c:\\a.txt"), FILE_ATTRIBUTE_NORMAL); 
    SetFileAttributes(_T("c:\\a.txt"), FILE_ATTRIBUTE_HIDDEN); 

    { 
     std::ofstream file(_T("c:\\a.txt")); 
     if (file.is_open()) { 
      std::cout << "ofstream open" << std::endl; 
     } else { 
      std::cout << "ofstream not open!" << std::endl; 
     } 
    } 
    getchar(); 
} 

這裏是我的。如果我使用FILE_ATTRIBUTE_NORMALofstream將成功打開越來越

ifstream open 
ofstream not open! 

輸出。

我不以管理員身份運行程序。但是,我確實使用了以下鏈接器選項。

linker options

有轉沒有啓用用戶帳戶控制(UAC)是很重要的,如果我們不啓動應用程序作爲管理員。操作系統將幫助我們將實際文件寫入C:\Users\yccheok\AppData\Local\VirtualStore\a.txt而不是保護C:\

ofstream是否在Windows 7隱藏文件失敗,是預期的行爲?

+0

當你說你使用「下面的鏈接器選項」時,這七個鏈接器選項中的哪一個是你指的那個選項,爲什麼你認爲這很重要?虛擬商店是否真的與這個問題有關? –

+0

我更新了這些信息,以幫助您理解爲什麼對於UAC轉向否重要。 –

+0

您是否在打開'ofstream'之前嘗試關閉'ifstream'? –

回答

2

是的。如底層CreateFile documentation所述,「如果指定了CREATE_ALWAYSFILE_ATTRIBUTE_NORMAL,則CreateFile將失敗並將最後一個錯誤設置爲ERROR_ACCESS_DENIED(如果該文件存在並且具有FILE_ATTRIBUTE_HIDDENFILE_ATTRIBUTE_SYSTEM屬性)。

或者更可讀:CreateFile如果兩個CREATE_ALWAYSFILE_ATTRIBUTE_NORMAL指定失敗,並且如果該文件具有FILE_ATTRIBUTE_HIDDEN和/或FILE_ATTRIBUTE_SYSTEM屬性。

恰好如此,ofstream調用CreateFile這樣。

+0

但更奇怪的是,上面列出的文檔是針對「Windows Server 2003和Windows XP/2000」指定的。但是我在Windows 7中只遇到這個問題。我在Windows XP中沒有遇到這樣的問題。 –

+0

我認爲問題只出現在Windows 7中。我做了進一步的測試。它似乎也是在Windows XP中。 –