【问题标题】:Can I allow multiple programs to read from the same file at the same time?我可以允许多个程序同时从同一个文件中读取吗?
【发布时间】:2012-07-18 23:55:51
【问题描述】:

我有一个应用程序可以读取一组数据文件并执行一些模型计算。程序本身不需要修改数据文件,所以我目前使用只读标志打开它们,如下所示:

FILE* file;
if(_wfopen_s(&file, fname.c_str(), L"r") == 0)
...

我想让我的程序的多个实例同时运行,使用相同的数据集,但对数据执行不同的计算。我的程序都不需要修改数据文件。由于数据文件非常大,我无法为每个程序制作单独的数据副本。

我假设因为我以只读权限打开文件,所以两个程序可能同时从同一个文件中读取。相反,我收到各种错误,例如“文件无法打开,因为它正在被另一个进程使用”。

由于我的开发环境是 Windows 7,this question suggests it might be a matter of enabling read sharing。但是,该线程中的所有答案都依赖于CreateFile,而我正在处理使用 stdio.h 编写的遗留代码。

有没有一种方法可以让多个程序使用 fopen 函数类同时从一个文件中读取?

【问题讨论】:

  • 我认为除了使用 CreateFile() 之外别无他法。问题是如何从 HANDLE 中获取 FILE*。
  • 你也可以使用std::ifstream ..毕竟这被标记为c++?
  • @Paranaix:_open_osfhandle,然后是_fdopen
  • _wfopen_s() 被记录为以非共享模式打开文件:msdn.microsoft.com/en-us/library/z5hh6ee9.aspx 文档建议使用 _wfsopen() 如果您想指定文件应该是可共享的并且可以使用 MS - 特定的文件打开函数(如_wfopen_s() 一样)。

标签: c++ c windows file winapi


【解决方案1】:

如果您可以更改fopen 例程,请尝试将fopen 调用替换为_fsopen,以实现共享读/写。 _fsopen 是特定于 mscrt 的。

如果您可以使用CreateFile,并且不想重写所有旧代码以进行读/写,您也可以尝试将FILE * 与winapi 文件句柄相关联.使用_open_osfhandleCreateFile 返回的文件句柄中获取文件描述符,然后使用_fdopen 从该文件描述符中获取FILE *

【讨论】:

    猜你喜欢
    • 2015-01-05
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多