如何读取正在使用的文件

How to read from a file that is in use

本文关键字:文件 何读取 读取      更新时间:2023-10-16

有一个我想进入的文件,但每当我尝试打开它时,我都会收到消息"该进程无法访问该文件,因为它正被另一个进程使用"。

好吧,我想进去!那么,我该怎么做呢?

我一直在集思广益,尝试几种方法,我希望在其他方法上得到一些意见,或者如果我的想法由于某种对我来说不明显的原因而行不通。

  • 想法 1 文件夹知道文件在哪里,只是不会打开它。如果我创建一个程序来读取文件的内存地址,复制它,然后在其他地方重建它怎么办?我不确定这是否有希望,因为它依赖于作为问题的文件。
  • 想法 2 我的进程如何知道另一个进程正在使用该文件?如果它正在检查所有其他进程,也许我还可以找出哪个进程正在使用该文件并暂停或结束它。

这两个想法中的任何一个都可能需要我数周的时间。是否有人更有创造力,可以想出另一种方式;还是知识渊博并消除不切实际的想法?

在 Windows 中,允许应用程序获取文件的独占锁。 当进程打开文件时,您指定的一件事是,当您的进程打开该文件时,还有谁可以访问该文件(这些是 .NET 方法,但其他语言中存在等效项)。 例如,Excel因在打开文件时获得独占锁而臭名昭著。 解决方法通常是找到有问题的进程并杀死它以打破锁。 解锁是我最熟悉的应用程序来完成此操作。 但是,如果该进程是系统进程,则可能无法终止它。 您必须重新启动才能重置锁。

直接从另一个进程的内存中读取不太可能是可靠的。 应用程序可能没有内存中副本,可能没有完整的内存副本,可能没有一致的内存副本,并且可能没有与磁盘上的内容匹配的内存中副本(例如,如果他们正在编辑文档)。

您的进程知道文件已锁定,因为当它尝试打开文件时,它会通过请求操作系统访问该文件来实现。 操作系统响应说:"请求被拒绝。 另一个进程打开并锁定了此文件。 操作系统不会告诉您的进程哪个进程打开了文件,因为尝试打开文件不包括询问谁已经打开了该文件。 您的流程必须提出正确的问题才能获得所需的答案。

Windows 允许您在打开文件时指定共享模式。共享模式可能会阻止在打开文件时读取、写入或删除文件。如果要允许同时读取访问,则应在调用CreateFile时在 dwShareMode 参数中包含FILE_SHARE_READ (http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx)。

换句话说,如果要启用对打开文件的并发访问,则必须首先修改文件的打开方式。

C 和 Java 中的可移植标准库不提供在打开文件时设置共享模式的方法,但它们在 Windows 上的常用实现将共享模式设置为 READ+WRITE。