【问题标题】:win32 C/C++ read data from a "locked" filewin32 C/C++ 从“锁定”文件中读取数据
【发布时间】:2013-01-03 14:20:46
【问题描述】:

知道如何从被另一个进程锁定的文件中读取数据吗?

当我尝试 fopen() 或 CreateFile() 或 OpenFile() 时,我遇到了共享冲突。

但是,如果我转到命令提示符并执行“c:> more blah.h”,我可以看到该文件。所以“更多”可以以某种方式读取文件。知道它是如何实现的吗?

谢谢!

【问题讨论】:

  • 您是以只读方式打开文件还是以读/写方式打开文件? “更多”以只读方式打开。
  • 访问冲突不一定是锁定文件。一些实际的代码会很有用。
  • Sorry 表示共享违规。我正在尝试将其打开为“只读”。 IE。 fopen() 中的“r”和创建文件中的 GENERIC_READ、FILE_SHARE_READ。
  • 我想一种方法是将文件复制到一个新的临时文件中?

标签: c++ c winapi


【解决方案1】:

我正在尝试以“只读”方式打开它。 IE。 fopen() 中的“r”和创建文件中的 GENERIC_READ、FILE_SHARE_READ

显然文件没有被锁定读取,否则 more 命令无法工作。因此,该进程在创建文件时确实指定了读取共享。错误只是在您自己尝试打开文件时指定 FILE_SHARE_READ。那否认写共享。那行不通,该进程已经获得了对该文件的写访问权,您不能拒绝它。相反,您将因共享冲突而被拒绝访问。您必须还指定 FILE_SHARE_WRITE 才能访问该文件。

这将解决您的问题。唯一的另一个问题是您将从正在写入的文件中读取。所以文件中的数据会发生完全不可预测的变化。

【讨论】:

  • 你可能是对的!会试一试并更新。我真的不介意数据更改,因为我确信数据只会被附加。所以我的应用程序会像“tail -f”一样工作。谢谢!
【解决方案2】:

fopen 已弃用,msdn 建议使用 fopen_s,但未为此启用共享。

由 fopen_s 和 _wfopen_s 打开的文件不可共享。如果您需要 文件可共享,使用 _fsopen, _wfsopen 和适当的 共享模式常量(例如,_SH_DENYNO 用于读/写 分享)。

使用 _fsopen 打开文件并启用共享标志 (_SH_DENYNO) 以授予共享访问权限。

fsopen

【讨论】:

    【解决方案3】:

    一种方法是将文件复制到一个新的临时文件并读取它。

    【讨论】:

      【解决方案4】:

      请阅读 - http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx 当您说“访问冲突”时,您的意思是 Win32 0xc000005 错误还是其他什么?

      【讨论】:

      • 抱歉的意思是共享违规:ERROR_SHARING_VIOLATION。
      猜你喜欢
      • 2018-04-19
      • 2014-11-06
      • 2013-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-21
      相关资源
      最近更新 更多