java.nio.Files.move() - OS X上的DirectoryNotEmptyException

时间:2013-03-09 12:43:05

标签: java file osx-lion nio move

我正在运行第三方库,其部分操作是将zip文件下载到临时目录,解压缩然后将其从临时目录移动到最终目录......出于某种原因,这个将系统属性保留为默认值时失败:

java.nio.file.DirectoryNotEmptyException: /var/folders/j_/1v53z7q15v51wyb00jzht_ch0000gn/T/vertx-68e24a9e-ee15-4b49-a796-7176714865ec
   at sun.nio.fs.UnixCopyFile.move(UnixCopyFile.java:491)
   at sun.nio.fs.UnixFileSystemProvider.move(UnixFileSystemProvider.java:261)
   at java.nio.file.Files.move(Files.java:1345)
   ...

但是,如果我将java.io.tmpdir设置为.tmp(并在我的工作目录中创建一个.tmp目录),它就可以了!

如果我使用sudo,这也行不通。

这真让我烦恼......我需要做些什么才能让它在OS X上运行?

> java -version
  java version "1.7.0_17"
  Java(TM) SE Runtime Environment (build 1.7.0_17-b02)
  Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)

> uname -a
  Darwin daryl-teos-macbook-pro.fritz.box 12.2.0 Darwin Kernel Version 12.2.0: Sat Aug 25 00:48:52 PDT 2012; root:xnu-2050.18.24~1/RELEASE_X86_64 x86_64

此致 达里尔

1 个答案:

答案 0 :(得分:3)

考虑Files.move {{1}}的以下内容:

  

当调用移动非空目录时,如果不需要移动目录中的条目,则移动目录。例如,重命名同一FileStore上的目录通常不需要移动目录中的条目。移动目录时需要移动其条目,然后此方法失败(通过抛出IOException)。移动文件树可能涉及复制而不是移动目录,这可以使用copy方法与Files.walkFileTree实用程序方法一起完成。

这意味着此功能并非旨在跨网络或不同的FileStore移动文件。当你改变tmp位置时它适用于你,因为在这种情况下它只是简单地进行重命名而不是物理移动。

您没有提及如何选择“最终目录”,但如果是用户控制的话,它似乎必须是本地位置。