来自 Java NIO2 中的临时文件的 Files.copy 上的 AccessDeniedException

Posted

技术标签:

【中文标题】来自 Java NIO2 中的临时文件的 Files.copy 上的 AccessDeniedException【英文标题】:AccessDeniedException on Files.copy from a temporary file in Java NIO2 【发布时间】:2014-05-11 20:59:39 【问题描述】:

我已经习惯了 Java 7 和新的 Files 类。

我正在编写一个小应用程序,它在某些时候必须替换文件的内容。 如果出现问题,我使用了一个临时文件来避免擦除目标文件。但是,在执行实际复制时,我总是收到AccessDeniedException

这是我的代码:

// Temporary file generation.
Path target = getCurrentConfigFile(); // Returns a path, works ok.
Path tempFile = Files.createTempFile("tempfile", null);
Files.write(tempFile, conf.getBytes(Charset.defaultCharset()), StandardOpenOption.WRITE);

// Actual copy.
Files.copy(tempFile, target, StandardCopyOption.REPLACE_EXISTING);

// Cleanup.
Files.delete(tempFile);

getCurrentConfigFile()处理目标文件路径创建:

(... generates various strings from configuration parameters)
return FileSystems.getDefault().getPath(all, these, various, strings);

当我执行代码时,它是通过 .bat 脚本执行的,并且我在标准命令提示符或提升中都遇到了错误。 目标文件位于C:\temp\tests 中,这是我使用同一个 Windows 用户创建的目录。

似乎问题在于从临时文件中读取,因为直接写入目标是可行的。 接下来我应该看哪里?

【问题讨论】:

作为一个测试,你能不能写到目标而不是临时? getCurrentConfigFile 是做什么的?也许它打开文件而不关闭它? @assylias 我编辑了我的问题以添加有关getCurrentConfigFile() 的详细信息。我认为这与问题无关。直接写入目标作品。可能我的try块太宽了,问题其实出在读取temp文件上。 【参考方案1】:

不是答案,但评论太长了。我运行下面的代码(从 Windows 7 上的命令行),它按预期工作:

public static void main(String[] args) throws IOException 
    Path target = Paths.get("C:/temp/test.txt"); // Returns a path, works ok.
    Path tempFile = Files.createTempFile("tempfile", null);
    Files.write(tempFile, "abc".getBytes(UTF_8), StandardOpenOption.WRITE);

    // Actual copy.
    Files.copy(tempFile, target, StandardCopyOption.REPLACE_EXISTING);

    // Cleanup.
    Files.delete(tempFile);

所以您的问题不在于该代码。它可能在您的代码中的其他位置,或者由于您正在使用的文件/文件夹的权限。

【讨论】:

感谢您的努力。这不是好消息,因此,作为代码问题,我可以解决,其余的,我不确定!我将尝试使用我自己的临时目录来规避这个问题。 经过一些代码探索后,我在之前调用的某个其他类中发现了一个BufferedReader,该文件未正确关闭该文件。我会接受你的“长评论”作为我问题的答案:“你的代码很好,在别处搜索。”

以上是关于来自 Java NIO2 中的临时文件的 Files.copy 上的 AccessDeniedException的主要内容,如果未能解决你的问题,请参考以下文章

在 java.nio2 中将路径设置为只读的正确方法

6.NIO2-PathPathsFiles

Java nioBlocking nio2

NIO2.0之copydelete和move

Java NIO2:NIO概述

删除java中的临时文件