使用Files.copy()选择文件名

7

我有一个临时文件在 /tmp 目录中,我想将其归档到其他地方,因此我尝试了以下命令:

import java.nio.file.Files;
[...]

Path source = Paths.get("/tmp/path/to/file_123456789.xml");
Path destination = Paths.get("/path/to/archive/dir/file.xml");
Files.copy(source, destination).

这个失败是因为:
/path/to/archive/dir/file.xml 不是一个目录
我知道这个问题!但是我只想选择目标文件的名称。
到目前为止,我有一些解决方案,但都不令我满意:
- 使用 Files.createTempDirectory 创建临时目录,然后将临时文件移动到该目录中,重命名它,然后将其移动到目标目录。 - 将临时文件复制到存档目录中,然后在那里重命名它。但如果重命名失败,存档目录中会有一些垃圾文件。 - 在存档目录中创建一个空文件,然后手动将源文件的内容复制到其中。
可能存在更简洁的解决方案。你知道吗?

1
只要父级目录存在,那就没问题。 - Jon Skeet
@JonSkeet 对不起,是的,父目录不存在。我假设中间目录会被创建,但事实并非如此。我试了一下,你可能是对的 :) - Arnaud Denoyelle
2
诚然,错误信息也可以更有帮助 :) - Jon Skeet
@JonSkeet 其实在我的情况下,我不知道为什么,但是真正的问题是/path/to/archive/dir实际上是一个文件。别问我怎么会变成文件的 :) 这个错误信息有些误导人。我会写一个自己的回答并提供测试用例来复现该问题。 - Arnaud Denoyelle
1个回答

1
在Jon的帮助下,我发现/path/to/archive/dir实际上是一个文件。错误信息有误导性,因为它说/path/to/archive/dir/file.xml不是目录,即使问题来自于/path/to/archive/dir
在Linux下重现步骤:
1) 创建文件/tmp/fakedir

touch /tmp/fakedir

2) 在Java中执行以下代码:
Path tempFile = Files.createTempFile("test", "test");
Files.copy(tempFile, Paths.get("/tmp/fakedir/destination.xml"));

你收到了错误信息:


Exception in thread "main" java.nio.file.FileSystemException: /tmp/fakeDir/destination.xml: is not a directory
  at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91)
  at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
  at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
  at sun.nio.fs.UnixCopyFile.copyFile(UnixCopyFile.java:243)
  at sun.nio.fs.UnixCopyFile.copy(UnixCopyFile.java:581)
  at sun.nio.fs.UnixFileSystemProvider.copy(UnixFileSystemProvider.java:253)
  at java.nio.file.Files.copy(Files.java:1271)
  at Test.main(Test.java:17)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:483)
  at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接