【问题标题】:java Cannot delete file, being used by another processjava无法删除文件,正在被另一个进程使用
【发布时间】:2015-03-06 18:27:01
【问题描述】:

我有这个代码

 import org.apache.commons.io.FileUtils;
    try {
        FileUtils.copyURLToFile(new URL(SHA1_LINK), new File("SHA1.txt"));
        if(!sameSha1()) {
            System.out.println("sha diferentes");
            FileUtils.copyURLToFile(new URL(LINK), new File(PROG));
        }
    } catch (Exception e) {
        System.out.println("Internet is off");
    }
    //delete SHA1 file
    Files.deleteIfExists(Paths.get("SHA1.txt"));

当我执行它时,它会说

java.nio.file.FileSystemException
该进程无法访问该文件,因为它正被另一个进程使用(在 sun.nio.fs.WindowsException 中)

sameSha1()我有这个:

String sha1Txt = new Scanner(new File("SHA1.txt")).useDelimiter("\\Z").next();

我想删除文件“SHA1.txt”。我该怎么做?

【问题讨论】:

  • 还有什么在使用这个文件,保持打开状态?
  • 你能提供sameSha1实现吗?

标签: java delete-file


【解决方案1】:

我猜你用sameSha1 打开SHA1.txt 来阅读它却忘记关闭它。

编辑:

根据您的评论,您在sameSha1 中包含以下行:

String sha1Txt = new Scanner(new File("SHA1.txt")).useDelimiter("\\Z").next();

因此,您创建了一个扫描仪实例,但没有明确关闭它。你应该这样做:

Scanner s = new Scanner(new File("SHA1.txt"));
try {
    String sha1Txt = s.useDelimiter("\\Z").next();
    ...
    return result;
}
finally {
    s.close();
}

或者正如@HuStmpHrrr 在 Java 7 中所建议的那样:

try(Scanner s = new Scanner(new File("SHA1.txt"))) {
    String sha1Txt = s.useDelimiter("\\Z").next();
    ...
    return result;
}

【讨论】:

  • 谢谢。在同一个Sha1 我有这个:String sha1Txt = new Scanner(new File("SHA1.txt")).useDelimiter("\\Z").next();。如何关闭它?
  • 您在变量 s 中分配 new Scanner(...) 并在返回之前调用 s.close()
  • 你使用try(Scanner s = new Scanner(new File("SHA1.txt")))自动关闭文件。
【解决方案2】:

如果它正被另一个进程使用,我猜是某个其他程序打开了该文本文件。尝试关闭其他程序。

【讨论】:

  • 所有程序都关闭了,除了我用的IDE,也没有打开SHA1.txt文件
  • @dan_san_1,有些东西肯定会锁定它:异常说明了这一点。使用一些工具来找出这样做的原因:technet.microsoft.com/en-us/sysinternals/bb896653.aspx
  • 或者去保存的目录,列出隐藏文件,自己删除锁。在 linux 中使用 ls -a 来显示文件,并删除有 ~.不确定Windows是否相同,但您可以在文件夹属性下显示隐藏文件并查看是否可以找到.lock文件。
【解决方案3】:

尝试在使用时自动关闭文件资源,如下所示:

Path tempFilePath = fileUtil.createTempFile( uploadedInputStream, fileDetail.getFileName() );
File tempFile = tempFilePath.toFile();

try (InputStream is = new FileInputStream( tempFile )) {
    uploadDocument( fileTypeId, description, is );
} catch (IOException e) {
    LOGGER.debug( e );
}

Files.deleteIfExists( tempFilePath );

【讨论】:

    猜你喜欢
    • 2012-08-04
    • 2016-09-21
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    相关资源
    最近更新 更多