2014-12-05 24 views
2

我一直在嘗試在SHGetFolderPath返回的路徑中寫入文件。但是,隨着文件被創建,它已被寫保護。以下是我的代碼:使用CreateFile函數創建文件會導致寫保護文件

#include <Windows.h> 
#include <Shlobj.h> 
#include <iostream> 
#include <Shlwapi.h> 

int main() 
{ 
    HANDLE hfile; 
    TCHAR szPath[MAX_PATH]; 
    char dataBuffer[] = "Some data to write here"; 
    DWORD dwBytesWritten = 0; 
    if(SUCCEEDED(SHGetFolderPath(NULL,CSIDL_COMMON_APPDATA,NULL,0, szPath)))  
    { 
     std::cout << szPath << std::endl; 
     PathAppend(szPath,TEXT("lpa")); 
     std::cout << szPath << std::endl; 
     PathAppend(szPath,TEXT("config")); 
     std::cout << szPath << std::endl; 
     CreateDirectory(szPath, NULL); 
     PathAppend(szPath, TEXT("lpa.config")); 
     std::cout << szPath << std::endl; 
     hfile = CreateFile(szPath,GENERIC_READ|GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL); 
     /*WriteFile(hfile,dataBuffer,(DWORD)strlen(dataBuffer),&dwBytesWritten,NULL); 
     std::cout << szPath <<std::endl;*/ 
    } 

} 

的代碼創建在下的文件:\ ProgramData \ LPA \ CONFIG \ lpa.config,但編輯的文件會彈出對話框說WriteProtection。我在這裏做錯了什麼?

+0

你對你的機器有管理權限嗎?我在Visual Studio 2013下編譯了你的程序,執行它。我可以編輯該文件。我沒有遇到任何問題。 – user1 2014-12-05 06:40:27

+0

我以管理員身份運行Visual Studio。這是否帶來錯誤? – Pant 2014-12-05 06:45:34

+0

是的,當您以管理員權限運行VS實例時,會爲創建的文件分配特殊權限。以非管理員身份作爲程序運行或仔細使用SECURITY_DESCRIPTOR。 http://msdn.microsoft.com/en-us/library/aa446595.aspx 鏈接中的示例顯示瞭如何創建註冊表項,您可以將CreateFile()改爲。 – user1 2014-12-05 07:01:22

回答

0

我用CSIDL_LOCAL_APPDATA,而不是CSIDL_COMMON_APPDATA解決的問題。我有修改後的代碼給出如下:

#include <Windows.h> 
#include <Shlobj.h> 
#include <iostream> 
#include <Shlwapi.h> 

int main() 
{ 
    HANDLE hfile; 
    TCHAR szPath[MAX_PATH]; 
    char dataBuffer[] = "Some data to write here"; 
    DWORD dwBytesWritten = 0; 
    if(SUCCEEDED(SHGetFolderPath(NULL,CSIDL_LOCAL_APPDATA,NULL,0, szPath))) 
    { 
     std::cout << szPath << std::endl; 
     PathAppend(szPath,TEXT("lpa")); 
     if(!CreateDirectory(szPath, NULL)) 
     { 
      std::cout << "Create directory failed" <<std::endl; 
     } 
     std::cout << szPath << std::endl; 
     PathAppend(szPath,TEXT("config")); 
     if(!CreateDirectory(szPath, NULL)) 
     { 
      std::cout << "Create directory failed" <<std::endl; 
     } 
     std::cout << szPath << std::endl; 
     PathAppend(szPath, TEXT("lpa.config")); 
     std::cout << szPath << std::endl; 
     hfile = CreateFile(szPath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL); 
     WriteFile(hfile,dataBuffer,(DWORD)strlen(dataBuffer),&dwBytesWritten,NULL); 
     std::cout << szPath <<std::endl; 
    } 

} 
1

是的,當您使用管理權限運行VS實例時,將爲創建的文件分配特殊權限。以非管理員身份運行程序或使用SECURITY_DESCRIPTOR,以便其他用戶可以訪問該文件。

Creating a Security Descriptor for a New Object in C++

鏈接中的例子顯示了一個註冊表項是如何創建的,你可以把的CreateFile()代替。

+0

當我使用** CSIDL_LOCAL_APPDATA ** insted ** ** CSIDL_COMMON_APPDATA ** – Pant 2014-12-05 07:37:43

+0

時,我確實解決了這個問題。顯然,使用LOCAL_APPDATA時不會遇到問題。 CSIDL_COMMON_APPDATA引用包含所有用戶的應用程序數據的文件夾。 請參閱http://msdn.microsoft.com/en-us/library/windows/desktop/bb762494%28v=vs.85%29.aspx – user1 2014-12-05 07:42:01

+0

我在使用CSIDL_COMMON_APPDATA時面臨寫保護。但是使用CSIDL_LOCAL_APPDATA可以解決問題。 – Pant 2014-12-05 07:46:26