用C++创建一个只读文件
Create a read-only file in C++
我需要使用我的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);
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- C++ ifstream 只读一个单词的数量
- 如何让它在C++中只读一个单词
- 在另一个函数/构造函数 [C++] 中初始化后使变量只读
- 如何在Qt中创建一个持续正确的只读模型/视图架构
- 打开/写入另一个应用程序已在只读模式下打开的文件
- 用C++创建一个只读文件
- 除了一个只读条目外,其他所有条目都为只读的向量的实现
- 从c++的int指针返回一个只读指针