2014-09-29 138 views
2

我需要在文件中使用我的VC++ MFC應用程序保存文本信息,以便它是隻讀的。 到目前爲止,我已經考慮了兩種選擇,但我不滿意用C++創建一個只讀文件

1)我可以將文件另存爲pdf。但是我看過的兩個pdf庫,都顯示出一個陡峭的學習曲線。

2)壓縮文件內的文件,甚至密碼保護它。但是,這仍然不能使其成爲只讀。對於壓縮,我發現這個美好的圖書館 - http://www.codeproject.com/Articles/7530/Zip-Utils-clean-elegant-simple-C-Win

你能否建議我一個更好的方式來做到這一點。

FWIW,我在Visual Studio 2013上,所以我可以使用C++ 11。此外,我有Boost鏈接到我的代碼。

+1

即使PDF文件有足夠的動機也可以修改。我認爲你不應該以防止他人編輯你的文件爲目的 - 考慮用數字簽名來代替,這樣你就可以檢測到這種修改並做出適當的反應。 – 2014-09-29 15:31:28

+0

@FrédéricHamidi,這是一個很好的建議。你能否建議我用C++做一個簡單的方法?我熟悉這個總體思路,因爲我知道Git使用類似的東西來創建哈希 – 2014-09-29 15:32:58

+0

在Stack Overflow上有很多問題需要解決。快速搜索顯示[數字簽名與CryptVerifySignature](http://stackoverflow.com/q/12713715/464709),這可能適合您作爲起點。 – 2014-09-29 15:36:51

回答

2

您可以使用boost::filesystem用下面的函數來實現:

void permissions(const path& p, perms prms);

一個path可以從一個字符串構造,所以沒有問題存在。難度部分是perms這是一種位掩碼。您需要在該位掩碼中使用remove_perms來表示應刪除權限。

下面的代碼應該工作(未經測試):

using boost::filesystem::perms; 
boost::filesystem::path myPath("foo.txt"); 
boost::filesystem::permissions(myPath, 
    perms::remove_perms|perms::owner_write|perms::others_write|perms::group_write); 

Boost Filesystem reference

+1

這不是很有用。大多數人都是Windows機器上的管理員,因此他們可以輕鬆地更改這些權限。 – 2014-09-29 16:09:21

+0

@ n.m。在我的情況下,是的,每個人都是管理員,所以我猜這是行不通的。感謝您指出。 – 2014-09-29 16:41:45

+0

在這種情況下(多個管理員在同一臺機器上)絕對沒有任何工作。不要感謝我指出這一點,這是非常明顯的。你有安全問題,而不是編程問題。我建議在http://security.stackexchange.com問你的問題。 – 2014-09-29 17:06:39

1

你也可以只做到這一點:

ofstream out; 
out.open("test.txt"); 
out.close(); 
//attrib [parameters] [file] 
//+R -> readonly 
//+H -> hidden 
//+S -> system file (ultra hidden) 
//There are more, type 'attrib /?' in cmd to find all of the options 
system("attrib +R test.txt"); 

就是這樣!如果您有任何問題,請告訴我。

編輯

在Windows這隻適用,因爲它採用的是直接控制檯命令。

0

我會使用以下代碼:

HANDLE HFILE =的CreateFile(L 「read_only_file.txt」,GENERIC_ALL,0,NULL,FILE_SHARE_WRITE,FILE_ATTRIBUTE_READONLY,NULL);