2014-09-29 140 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);