如何从正在使用的文件中读取

时间:2014-11-14 22:14:47

标签: java c++ c windows

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

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

我一直在集思广益尝试一些方法,我希望能在其他方面得到一些意见,或者如果我的想法因某些原因不适合我的想法。

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

这些想法中的任何一个都可能需要数周时间。是否有人更有创意,可以想到另一种方式;或者更有知识并消除不切实际的想法?

2 个答案:

答案 0 :(得分:1)

在Windows中,允许应用程序获得独占locks on files。当进程opens the file时,您指定的一件事是who else can access it while your process does(这些是.NET方法,但其他语言中存在等价物)。例如,Excel因打开文件时获得独占锁而臭名昭着。围绕它的方式通常是to find the offending process and kill it来打破锁定。 Unlocker是我最熟悉的应用程序。但是,如果该过程是系统进程,则可能无法将其终止。您必须重新启动才能重置锁定。

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

您的进程知道该文件已被锁定,因为当它尝试打开文件时,它会通过要求操作系统访问该文件来执行此操作。操作系统响应说“请求被拒绝。另一个进程打开并锁定此文件”。操作系统不会告诉您的进程文件打开的是什么进程,因为尝试打开文件不包括询问谁已打开文件。您的流程必须提出正确的问题才能获得您正在寻找的答案。

答案 1 :(得分:1)

Windows可让您在打开文件时指定共享模式。共享模式可能会阻止在打开文件时读取,写入或删除文件。如果您想允许同时读取访问权限,则在致电FILE_SHARE_READhttp://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx)时,应在dwShareMode参数中添加CreateFile

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

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