2011-01-03 10 views
1

を移動していない:JavaのrenameTo()関数は、私はメディアモジュールで実行されている次の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に移動するために失敗しました」

Iこれは単純な問題であれば、Javaにはかなり新しいので、許してください。私は両方のディレクトリが存在するという事実を知っています。これと関連があるかもしれない重要なメモは、私はヒューズを使ってS3バケットをファイルシステムにマウントしています。

+0

ファイルは移動元と移動先のディレクトリツリー全体が存在する場合にのみ移動できますが、これを確認できますか? –

+0

新しいStreamAliasRefを使用するたびに新しいファイルが生成されますが、Fileファイルが実際にファイルを取得したことを確認する方法はありますか? –

+1

'File.isFile()'、 'File.isDirectory()'、 'File.exists()'を使うことができます。 –

答えて

7

unix上で実行されているJavaでは、renameToは同じファイルシステム内にある場合にのみ機能します。したがって、ファイルシステム間を移動する場合は、元のファイルをコピーして削除する必要があります。 unix mvコマンドもこれを行います。これは、mvが同じファイルシステム上で瞬間的ですが、永遠にファイルシステム全体にかかるためです。それは異なるファイルシステムを検出し、その場合はコピーを削除します。

2

私はこの問題を回避するには、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); 
    } 
    } 
}

1

まず、

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

が本当に存在していることをあなたは確かにありますか?あなたはそれを移動しようとする前にfile.exists()で確認できますか?