用C++创建一个只读文件

Create a read-only file in C++

本文关键字:一个 只读 文件 C++ 创建      更新时间:2023-10-16

我需要使用我的VC++MFC应用程序将文本信息保存在一个文件中,这样它将是只读的。到目前为止,我已经考虑了两种选择,但我对都不满意

1) 我可以把文件保存为pdf格式。但我看过的几个pdf库,似乎都有一个陡峭的学习曲线。

2) 压缩档案中的文件,甚至用密码保护它。但是,这仍然不能使它成为只读文件。我发现了一个很棒的图书馆——http://www.codeproject.com/Articles/7530/Zip-Utils-clean-elegant-simple-C-Win

你能给我一个更好的方法吗?

FWIW,我在Visual Studio 2013上,所以我有C++11可用。此外,我的代码中还链接了Boost。

您可以使用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文件系统引用


编辑9/2020

关于删除只读文件的说明。在Linux中,只要有人对直接父目录有写访问权限,他们就可以删除该文件(除非采取极端措施)。在Windows中,您需要恢复对文件的写入访问权限才能将其删除。

我选择删除权限,而不是在原始答案中将权限明确设置为只读,因为Boost文档中有一个关于只有写入权限才能执行任何操作的注释。有趣的是,我可以说我在permissions(path, owner_read|others_read|group_read)(在windows中)方面取得了成功,但为了安全起见,我想我们应该遵循文档。

我还要注意的是,如果你有C++17,这个完整的答案基本上是没有意义的,因为std::filesystem对你来说是可用的(API非常像Boost的)。

您也可以这样做:

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,因为它使用直接控制台命令。

我将使用以下代码:

HANDLE  hFile = CreateFile(L"read_only_file.txt", GENERIC_ALL, 0, NULL, FILE_SHARE_WRITE, FILE_ATTRIBUTE_READONLY, NULL);