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

时间:2014-04-01 07:58:32

标签: java file permissions nio2

我习惯了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用户创建的目录。

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

1 个答案:

答案 0 :(得分:2)

不是答案,但评论太久了。我运行下面的代码(从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);
}

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