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

标签 java c++ c windows

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

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

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

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

这些想法中的任何一个都可能需要我数周的时间。有没有人更有创意,能想出别的办法;还是知识渊博并消除不切实际的想法?

最佳答案

在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 是我最熟悉的应用程序,可以实现这一点。但是,如果该进程是系统进程,您可能无法终止它。您必须重新启动才能重置锁。

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

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

关于java - 如何从正在使用的文件中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26939755/

相关文章:

java - 如何在 Java 正则表达式中包含命名捕获组?

java - 带有 ejb 模块的 Maven ear 项目。生成 application.xml 时出错

c++ - __attribute__((optimize(0))) 适用于 "recursively"吗?

c - 如何在 C 中通过引用传递变量?

c - 格式参数太多 [-Wformat-extra-args]

c - 读取某些值并按 Enter 键时 fgets 发生冲突

java - Apache Tomcat - 来回流

java - 如何在 JENA 中添加限定基数

c++ - 使用 textEntered 时,我无法使用退格键删除字符串的最后一个字符

c++ - Source Insight//TODO 注释