【问题标题】:Create a read-only file in C++在 C++ 中创建只读文件
【发布时间】:2014-09-29 15:25:19
【问题描述】:

我需要使用我的 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 链接到我的代码中。

【问题讨论】:

  • 如果有足够的动力,甚至可以修改 PDF 文件。我认为您不应该以阻止其他人编辑您的文件为目标——考虑改为对其进行数字签名,这样您就可以检测到此类修改并做出适当的反应。
  • @FrédéricHamidi,这是一个很好的建议。你能建议我用 C++ 做一个简单的方法吗?我熟悉一般的想法,因为我知道 Git 使用类似的东西来创建哈希
  • Stack Overflow 上有很多问题需要处理。快速搜索发现Digital signature with CryptVerifySignature,这可能适合您作为起点。
  • 很可能您正在尝试做完全错误的事情。 “只读”在不同的上下文中意味着不同的东西。为什么你认为你需要一个只读文本文件? PDF在这里毫无意义。任何用户都可以创建一个全新的文件并替换您的,而不是尝试更改您的 PDF。受密码保护的文件也没有任何意义。密码需要隐藏在某个地方。如果您可以隐藏密码,则可以隐藏原始文件,无需加密。此外,加密文件不可读,您需要不可写。
  • @n.m.,我正在存储信息以备后用,如果同时修改会很头疼。

标签: c++ file mfc readonly


【解决方案1】:

您可以使用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


2020 年 9 月 8 日编辑

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

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

我还想指出,如果您拥有 C++17,那么整个答案基本上没有实际意义,因为您可以使用 std::filesystem(API 非常类似于 Boost 的)。

【讨论】:

  • 这没什么用。大多数人都是 Windows 机器上的管理员,因此他们可以轻松更改这些权限。
  • @n.m.就我而言,是的,每个人都是管理员,所以我想这行不通。感谢您指出。
  • 在这种情况下(同一台机器上的多个管理员)绝对没有任何效果。不要感谢我指出这一点,这非常明显。您有安全问题,而不是编程问题。我建议您在security.stackexchange.com 提问。
  • @n.m.同意。我眼中的问题是如何以编程方式将文件权限设置为只读,而不是保护文件以使其无法对其进行任何更改,这是一个完全不同的问题。
  • @AndyG,谢谢分享,没说清楚很抱歉。
【解决方案2】:

你也可以这样做:

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

【讨论】:

    【解决方案3】:

    我会使用以下代码:

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

    【讨论】:

      猜你喜欢
      • 2019-10-25
      • 2017-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-19
      • 1970-01-01
      • 2015-05-21
      • 2017-05-12
      相关资源
      最近更新 更多