【问题标题】:java.nio.file Files.move() is copying instead of movingjava.nio.file Files.move() 是复制而不是移动
【发布时间】:2016-01-12 00:44:00
【问题描述】:

我正在尝试使用 Java NIO Files.move 方法来移动目录。它确实将目录内容复制到新位置,但它保留了旧目录。我认为这是一个复制操作,而不是移动操作。

任何想法为什么会发生这种情况?这是我的代码:

Path source = FileSystems.getDefault().getPath("C:\\test-source");
Path destination = FileSystems.getDefault().getPath("C:\\test-destination");
try {
    System.out.println("Moving files ...");
    Files.move(source, destination, StandardCopyOption.ATOMIC_MOVE);
    System.out.println("Done.");
} catch (IOException e) {
    System.out.println("Moving failed: " + e.toString());
}

同样,目标目录及其所有内容都会出现,但源文件夹仍然存在。

【问题讨论】:

  • 试试 StandardCopyOption.REPLACE_EXISTING 吗?你试过了吗?
  • C:\test-source 应该是C:\\test-source
  • 当您说“它保留旧目录”时,您的意思是它将文件保留在旧目录中吗?还是只是目录本身?
  • @Klitos Kyricou 保留源目录和文件。
  • 我认为它应该可以工作,ATOMIC_MOVE 确实是你想要的。如果您的实际源目录和目标目录位于不同的驱动器上,或者目标目录不存在,或者目标文件已经存在,则它将不起作用。

标签: java nio


【解决方案1】:

事实证明代码是正确的。但是源文件夹没有被删除,因为另一个进程仍在使用该文件夹。当我消除其他进程(将 AWS S3 目录下载到源文件夹)时,移动会按照我的预期发生。

【讨论】:

    【解决方案2】:

    this

    ATOMIC_MOVE 是文件操作。

    public static final StandardCopyOption ATOMIC_MOVE
    

    将文件作为原子文件系统操作移动。

    试试StandardCopyOption.REPLACE_EXISTING

    【讨论】:

    • 我应该表明我已经尝试了 REPLACE_EXISTING 选项。它不仅不是我要寻找的功能,而且也不能解决问题。
    【解决方案3】:

    我在尝试提交 IndexWriter 时遇到了 Apache Lucene 的这个问题。问题是在目录上打开了IndexSearcher,导致java.nio.file.atomicmovenotsupportedexceptionIndexReader 构造函数参数由 DirectoryReader.open(Directory directory) 提供。改用重载DirectoryReader.open(IndexWriter writer) 解决了这个问题。

    【讨论】:

      【解决方案4】:

      我在 zipFileSystem 上遇到了这个问题,但发现我需要调用 fileSystem.close() 才能真正从 zip 中删除它。

      【讨论】:

        猜你喜欢
        • 2017-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-02
        • 1970-01-01
        相关资源
        最近更新 更多