当前位置: 首页 > 知识库问答 >
问题:

从文件夹中读取文件两次,并获得“该进程无法访问该文件,因为它正被另一个进程使用”

江正德
2023-03-14

我有连接到文件夹的简单类,我想删除所有创建的常规文件,但当我读取同名文件(同一文件不止一次或两次插入文件夹)时,我得到错误

Exception in thread "main" java.lang.RuntimeException: java.nio.file.FileSystemException: c:\Temp\reader\msg.xml: The process cannot access the file because it is being used by another process.

    at com.project.test.Reader.lambda$0(Reader.java:38)
    at com.project.test.Reader$$Lambda$1/1418481495.accept(Unknown Source)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
    at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
    at com.project.test.Reader.main(Reader.java:28)
Caused by: java.nio.file.FileSystemException: c:\Temp\reader\msg.xml: The process cannot access the file because it is being used by another process.

    at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86)
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
    at sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:269)
    at sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:103)
    at java.nio.file.Files.delete(Files.java:1126)
    at com.project.test.Reader.lambda$0(Reader.java:35)
    ... 4 more

这是我的阅读课:

package com.project.test;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;

public class Reader {

    public static void main(String[] args) {
        Path path = Paths.get("c:\\Temp\\reader\\");
        WatchService watchService;

        try {
            watchService = path.getFileSystem().newWatchService();
            path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
            WatchKey watchKey = null;
            while (true) {
                watchKey = watchService.poll(5, TimeUnit.SECONDS);
                if (watchKey != null) {
                    try(Stream<WatchEvent<?>> events = watchKey.pollEvents().stream()) {
                        events.forEach(event -> {
                            if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
                                @SuppressWarnings("unchecked")
                                Path name = ((WatchEvent<Path>) event).context();
                                Path file = path.resolve(name);
                                try {
                                    if (Files.isRegularFile(file)) {
                                        Files.delete(file);
                                    }
                                } catch (Exception e) {
                                    throw new RuntimeException(e);
                                }
                            }
                        });
                    }
                    watchKey.reset();
                }
            }
        } catch (IOException | InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

}

你不知道什么是不正确的吗?我希望应该错过文件上的一些“关闭”,但路径只是文件上的目标,不应该关闭,应该吗?感谢所有提示。

共有1个答案

谷博艺
2023-03-14

如果您阅读WatchService的javadoc,它会说该实现依赖于操作系统,即。对于某些操作系统,当文件添加到文件夹时可能会生成多个事件:

例如,当监视目录中的文件被修改时,在某些实现中可能会导致单个ENTRY_MODIFY事件,但在其他实现中可能会导致多个事件。

我的直觉是这也是你的情况。

以下是一些类似的讨论:

Java7 WatchService-忽略同一事件的多次出现

JavaNIO Watch Service在将新文件添加到Watch文件夹时创建了ENTRY_CREATE和ENTRY_MODIFY

我要做的是将我要删除的文件的路径存储在一个并发集中,并且仅当当前路径不在该集中时才尝试删除。

 类似资料:
  • 下面是使用Ucanaccess Jdbc驱动程序从Microsoft Access文件filename.accdb获取连接的代码。但在运行此代码时,它会抛出异常,就像已经使用的文件一样。 但是我想在其他应用程序使用MSAccess数据库文件时并发地使用它。 当我运行上面的代码时,出现了如下异常: net.ucanaccess.jdbc.ucanaccesssqlexception:UCAEXC::

  • 我正在尝试测试我自己的antiweb版本,可以在这里找到。但是,我正在使用Pythons单元测试模块对其进行测试。代码如下: 除了功能外,所有功能都正常工作。在执行unittest时,如果不拆下,temp文件夹及其内容将被完美创建。但是使用功能,我得到一个错误: 当我再看临时文件夹时,文件夹本身仍然在那里,但现在是空的。这将是太多,包括我的反网络文件在这里,所以我有它在这里再次链接,如果你需要它。

  • 我的代码用于查看文件夹并删除分辨率为1920x1080的图像的脚本。我遇到的问题是,当我的代码运行时; 我收到以下错误消息: 我想确认一下,Python是我电脑上唯一运行的程序。导致此问题的原因是什么?如何解决?

  • 我的脚本搜索特定目录中的所有pdf文件,然后从pdf中提取一个id,并在文件中组织pdf。例如我有: 我想这样组织它们: 下面的脚本做的工作,但我认为只有最后一个文件输出以下错误: 回溯(最近一次调用):文件“C:\Users\user\Downloads\aa\project.py”,第74行,在操作系统中。rename(source,dest)PermissionError:[WinError

  • 当我试图删除一个文件时,它说我的服务器正在使用它,所以我尝试使用(Image img=Image.FromFile(imgFilePath))实现一个,但随后我得到了

  • 问题内容: 我的代码用于一个脚本,该脚本查看一个文件夹并删除分辨率为1920x1080的图像。我的问题是我的代码运行时; 我收到此错误消息: 只需确认一下,Python是我计算机上运行的唯一程序。是什么导致此问题,我该如何解决? 问题答案: 您的过程就是打开文件的过程(仍然存在)。您需要先关闭它,然后再删除它。 我不知道PIL是否支持上下文,但是是否支持: 进入之前,请确保删除(并关闭文件)。 如