【问题标题】:Using std:fstream how to deny access (read and write) to the file使用 std:fstream 如何拒绝对文件的访问(读取和写入)
【发布时间】:2009-05-08 13:45:10
【问题描述】:

如何拒绝访问我用 fstream 打开的文件?我想在使用 fstream 读取/写入文件时无法访问该文件?

【问题讨论】:

  • 我需要从文件中读取并根据内容更改行。我想在读取和写入文件时避免更改文件(具有最新数据且不要覆盖)我使用 fstream 实现它,是否需要将整个代码更改为使用句柄和缓冲区(readfile)或我可以从 fstream 获得句柄吗?我在使用 readfile 和 writefile 时遇到了麻烦,因为我需要逐行读取并写入 so 。 (对于 fstream,我使用了 getline 函数。fstream fs(path) while (!file.eof() ) getline (fs,line); do something... fs.write(str, str.size()); fs.clear (); fs.close();
  • 您想保护您的文件免受程序的另一个实例或其他程序的影响吗?首先,一个简单的解决方案是使用锁定文件/目录——大多数程序都是这样做的。第二,我从未见过它发生 - 如果你真的需要它,请参阅我的答案。

标签: c++


【解决方案1】:

你不能用标准的 fstream 来做到这一点,你必须使用平台特定的功能。

在 Windows 上,您可以使用 CreateFile()LockFileEx()。在 Linux 上,有 flock()lockf()fcntl()(正如前面的评论者所说)。

如果您使用的是 MSVC,您可以将第三个参数传递给 fstream 的构造函数。请参阅 Visual Studio 6newer versions 的文档。当然,它不适用于其他编译器和平台。

你为什么要把别人锁在外面?可能有更好的解决方案...

【讨论】:

【解决方案2】:

扩展 Casebash 的评论:

要在 Windows 中打开文件,以便其他进程无法写入,请使用

file.rdbuf()->open(path, std::ios_base::app, _SH_DENYWR);

_SH_DENYRW 将拒绝读写访问

【讨论】:

    【解决方案3】:

    在本机 C++ 中无法做到这一点,因为它高度依赖于平台。在 Linux/UNIX 上,您可以使用 flockfcntl 执行此操作。我不确定如何在 Windows 上执行此操作。

    在 Windows 上,您似乎必须将一些标志传递给 CreatFile 或使用 LockFileEx(允许字节范围锁定)。

    请注意,所有这些方法都适用于底层操作系统文件描述符/句柄,而不适用于fstreams。您将需要使用 Posix 或 Windows API 从文件中读取/写入,或者将文件描述符/句柄包装在 fstream 中。这又取决于平台。我确定有办法做到这一点,但我不记得了。

    【讨论】:

    • 我知道这已经有 10 年历史了,但是如何锁定一个文件比任何其他也使用特定于平台的系统调用的文件操作更依赖于平台?
    猜你喜欢
    • 2015-07-11
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    相关资源
    最近更新 更多