Java renameTo()函数没有移动文件

时间:2011-01-03 23:02:29

标签: java file-io

我在媒体模块中运行以下Java代码:

File file = new File("/my/path/"+String.format("%02d", date)+"/"+streamAliasRef+".mp4");

        // Destination directory
        File dir = new File("/mnt/s3");

        // Move file to new directory
        boolean success = file.renameTo(new File(dir, file.getName()));
        if (!success) {
            getLogger().info("File failed to move to s3"+file.getName());
        }
        else {
            getLogger().info("File moved to s3 successfully"+ file.getName());
        }

由于某种原因,我一直得到“文件未能转移到s3”

我对Java很新,所以如果这是一个简单的问题,请原谅我。我知道这两个目录都存在。可能与之有关的一个重要注意事项是我使用Fuse将S3存储桶挂载到文件系统。

3 个答案:

答案 0 :(得分:7)

在运行在unix上的Java中,renameTo仅在您位于同一文件系统中时才有效。因此,如果您要跨文件系统移动,则需要复制和删除原始文件。 unix mv命令也可以执行此操作。这就是为什么mv在同一个文件系统上是即时的,但在文件系统中永远存在。它会检测不同的文件系统,并在这种情况下进行复制删除。

答案 1 :(得分:2)

我使用Guava中的这个方法在Unix上移动文件来解决这个问题:

public static void move(File from, File to) throws IOException {
  Preconditions.checkNotNull(to);
  Preconditions.checkArgument(!from.equals(to),
    "Source %s and destination %s must be different", from, to);
  if (!from.renameTo(to)) {
    copy(from, to);
    if (!from.delete()) {
      if (!to.delete()) {
         throw new IOException("Unable to delete " + to);
      }
      throw new IOException("Unable to delete " + from);
    }
  }
}

答案 2 :(得分:1)

首先,你确定

new File("/my/path/"+String.format("%02d", date)+"/"+streamAliasRef+".mp4") 

真的存在吗?在尝试移动它之前,您可以查看file.exists()吗?